IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

intérêt des fichiers headers


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nee
    Nee est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 50
    Par défaut intérêt des fichiers headers
    Bonjour a tous,

    Développeur PHP, je poursuis lentement mais surement ma petite exploration du monde merveilleux du C++.

    Après avoir crée des classes et implémenté leurs méthodes dans des fichiers .cpp, je me pose des questions sur l'inclusion de ces classes :
    - Pourquoi je n'inclurai pas directement les fichiers .cpp dans mon main ?
    - Les .h ne servent qu'a définir les méthodes publiques pour une classe. Pourquoi ce fichier n'est pas généré automatiquement par le compilateur ?

    Merci de m'éclairer !

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par Nee Voir le message
    - Pourquoi je n'inclurai pas directement les fichiers .cpp dans mon main ?
    Parce que non seulement c'est sale, mais si tu modifies un truc dans un .cpp, même un simple commentaire, tu te retrouves obligé de tout recompiler.
    - Les .h ne servent qu'a définir les méthodes publiques pour une classe. Pourquoi ce fichier n'est pas généré automatiquement par le compilateur ?
    Parce qu'ils déclarent les méthodes privées aussi, ainsi que les variables membres. Et ils disent quelles méthodes sont privées ou publiques.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Parce qu'ils déclarent les méthodes privées aussi, ainsi que les variables membres. Et ils disent quelles méthodes sont privées ou publiques.
    + les méthodes inline, virtual, friend, ....

  4. #4
    Nee
    Nee est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 50
    Par défaut
    bonjour,

    Je comprends bien l'interet de la compilation séparée.

    Beaucoup d'aspect du language m'échappe, mais je ne peux pas m'empecher d'avoir l'impression de "perdre du temps" a réécrire le prototype de chacune de mes méthodes dans un fichier séparé.

  5. #5
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Exemple:
    Si tu fais une librairie en C++ et que tu la livres à quelqu'un pour qu'il l'utilise, tu vas fournir la librairie statique (.LIB) ou la librairie dynamique (.DLL), mais surtout le fichier .H qui donne l'interface de ta librairie. Tu n'es pas obligé de fournir les sources complètes (les implémentations des fonctions de ta librairie) si ce n'est pas nécessaire ou si tu veux rester maître de ta librairie.

  6. #6
    Nee
    Nee est déconnecté
    Membre averti
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 50
    Par défaut
    Oui, je comprends le but, mais c'est le coté "doublon" de l'écriture du prototype qui me chagrinne.
    Au moment du dev, il m'arrive de changer des noms de méthode, il faut le changer a deux endroits.

    En fait, c'est comme si j'écrivais manuellement la table des matiere d'un document...

    Mais si c'est une contrainte du langage, je vais devoir m'y plier

  7. #7
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 940
    Par défaut
    Dans le .h tu peux mettre la déclaration de ta fonction, et dans le .cpp sa définition. De cette manière, tu as juste à inclure le .h dans les .cpp qui ont besoin de connaître la classe, sans te poser mille questions. Avec les gardes d'inclusion, tu es sûr qu'aucune classe ne sera déclarée et définie de façon redondante, provoquant des erreurs.

    PS:
    Citation Envoyé par Nee Voir le message
    monde merveilleux du C++
    Je ne sais pas si les modo sont sensibles à la flatterie, ça peut être risqué des fois

  8. #8
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 469
    Par défaut
    Citation Envoyé par Nee Voir le message
    - Pourquoi je n'inclurai pas directement les fichiers .cpp dans mon main ?
    En théorie, tu peux, mais c'est vraiment très sale.

    L'idée, lorsque tu découpes ton travail en plusieurs fichiers, c'est notamment d'éviter d'avoir à tout recompiler. Donc, tout comme en C, tu compiles une fois, et tu ne recompiles ensuite que ce qui a besoin de l'être. Ensuite, une fois que tous les objets binaires ont été produits séparément, tu fais une édition des liens entre eux.

    D'où l'intérêt (entre autres) des .h, qui contiennent (entre autres) les prototypes de tes classes. Si le code objet a changé mais que la manière de les appeler reste la même, pas besoin de modifier tout le reste.

    Ensuite, tu viens du PHP et il y a une différence majeure : C++ peut compiler le code. Lorsque tu livres une bibliothèque, par exemple, l'utilisateur ne voit plus du tout le code source. Les prototypes de classes et de fonctions sont alors le seul moyen de pouvoir exploiter le code compilé.

    - Les .h ne servent qu'a définir les méthodes publiques pour une classe. Pourquoi ce fichier n'est pas généré automatiquement par le compilateur
    Pour deux raisons :

    D'une part, le compilateur n'a absolument pas à toucher au code source. Il doit l'interpréter et produire un objet à partir de lui. Un générateur de code, en revanche, est un logiciel complètement différent et distinct. C'est le piège des IDE, ça, d'ailleurs, de faire l'amalgamme Que se passerait-il si tu changeais de compilo et/ou de plate-forme ?

    D'autre part, et contrairement à une idée répandue, tu n'es absolument pas tenu d'écrire un .h à chaque fois que tu crées une classe. Pour aller plus loin, le compilateur lui-même se s'appuie pas du tout sur les extensions des fichiers pour en déduire la nature de ce qu'il lit. La seule chose qui compte est le flux continu de code, fût-il obtenu au travers d'inclusions répétées. Il y a juste des règles de bon usage à respecter quand on fait un projet.

    Maintenant, à quoi sert un prototype ? À déclarer à l'avance une entité (fonction, classe) pour pouvoir y faire référence même si elle n'est pas encore définie. Il faut savoir qu'en principe un code source C/C++ est lu en une seule passe (en tout cas par type d'opération). C'était spécialement vrai sur les ordinateurs de 1972, quand le C est sorti. Mais si tu as défini toute ta classe ou ta fonction en amont du code source qui l'utilise, tu n'as pas besoin du prototype.

    Exemple simple avec un seul fichier :

    1) Tu crées un fichier .cpp. Il contient main() et d'autres choses.
    2) Tu comptes définir des fonctions annexes (même pas des classes, à ce stade), et pour que ce soit plus propre, tu aimerais garder l'ordre rédactionnel, et la fonction main() en tête de fichier.
    3) Tu déclares donc toutes tes fonctions tout en haut de ton listing, et tant qu'à faire, tu ajoutes main() dans le lot. C'est facultatif puisqu'elle va être la première à être définie, mais c'est plus propre et ça te permet de garder un résumé de tout ce qui a été écrit dans ton fichier.
    4) Ce bloc de déclaration commence à être imposant. Tu le déportes donc dans un fichier .h et tu le remplaces par un #INCLUDE de ce fichier.
    5) Tu te rends compte que les autres morceaux de ton projet ont besoin de savoir également comment fonctionnent tes classes et fonctions, d'autant que, eux, ils ne liront pas le code.
    6) Tu t'aperçois qu'il te suffit de faire exactement le même #INCLUDE dans les fichiers concernés.

Discussions similaires

  1. Compiler aussi quand un des fichiers header a changé
    Par ikeas dans le forum Eclipse C & C++
    Réponses: 0
    Dernier message: 04/12/2014, 14h27
  2. [C++] Outils pour parser des fichiers header?
    Par Invité dans le forum Autres éditeurs
    Réponses: 0
    Dernier message: 26/04/2013, 16h37
  3. Modifier header des fichiers perl génerés
    Par imikado dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 12/02/2009, 21h41
  4. [gcc] ajouter un chemin relatif a des fichiers header
    Par wodel dans le forum Autres éditeurs
    Réponses: 4
    Dernier message: 12/11/2007, 13h54
  5. Réponses: 9
    Dernier message: 25/09/2005, 16h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo