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 :

[c++] placement des includes


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2002
    Messages
    291
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 291
    Par défaut [c++] placement des includes
    bonjour,

    voilà une question toute bête mais je n'ai pas trouvé de reponse sur google...

    Où mettre les includes ? dans .h ou dans le .cpp
    Ou alors les deux, selon le type d'information dans le fichier(classes, typedef...)?

    Si vous pouvez m'eclairer ce serait sympa de votre part

    merci

  2. #2
    Membre Expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 47

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Par défaut
    La réponse va dépendre du programmeur...

    D'après ma (courte) expérience, il serait préférable de mettre les #include uniquement où tu en as réellement besoin.

    Donc dans le .cpp, si tu n'en as pas besoin dans le .h...

  3. #3
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    Les includes sont généralement mis dans le .h, et c'est la bonne méthode de les mettre dans le .h, sauf celui qui nécessite d’être placé dans le .cpp, comme dans l’exemple !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    //cpp pour que le compilateur puisse faire le lien entre le .h et le .cpp
    #include "maclasse.h"
    Include/class

  4. #4
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Ti-R
    Les includes sont généralement mis dans le .h, et c'est la bonne méthode de les mettre dans le .h, sauf celui qui nécessite d’être placé dans le .cpp, comme dans l’exemple !
    On met le moins possible dans l'en-tête. Le moins possible de code -- plutôt que de mettre des choses non liées dans un même en-tête, on va en écrire deux, on va utiliser des idiomes tels que le parefeu de compilation,... --, le moins possible d'include -- on va utiliser des déclarations plutôt que de faire un include de la définition partout où c'est possible. L'objectif est de diminuer le couplage entre unités. Ça facilite la compréhension du système, ça facilite la réutilisation du code, et c'est bon pour le temps de recompilation -- c'est frustrant de voir du code recompilé parce qu'un entête dont il n'a pas besoin a été modifié.

  5. #5
    Membre Expert
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Par défaut
    c'est frustrant de voir du code recompilé parce qu'un entête dont il n'a pas besoin a été modifié.
    ?
    La il y a un problème effectivement !

    Je crois Jean-Marc.Bourguet (mais faut demander à la personne concerné -> CaptainChoc) que tu l'as noyé d'information, même si tout ce que tu dis est vrai. Tu as passé directement la seconde vitesse (pour faire une analogie), alors qu'il semble (mais j'ai peut être mal compris) qu'il souhaitait juste passer la première.

  6. #6
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Donc pour résumer : tu inclus dans le .h uniquement ce qui est nécessaire au .h

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Alors, pour rester en 1ere vitesse:

    Il faut inclure les .h (fichiers d'en-tête) là où tu en as besoin. C'est à dire:
    un en-tête (ou header) défini une classe (ou des fonctions). Donc lorsque tu vas utiliser une classe, que ce soit dans ton propre header ou dans ton .cpp, tu dois inclure l'en-tête dans lequel elle est définie.

    La deuxième vitesse consiste à utiliser les pare-feu de compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //fichier .h
     
    #ifndef MON_EN_TETE_H
    #define MON_EN_TETE_H
    //code
    #endif MON_EN_TETE_H
    Cette mesure sert à éviter d'inclure 2 fois le même header, et elle va s'avérer rapidement indispensable.

    La troisième vitesse consiste à privilégier les déclaration de classe dans les header. Par exemple, au lieu de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier ClasseA.h
    #include "ClasseB.h"
     
    class ClasseA
    {
    // [...]
     
        ClasseB objet;
    };
    il est préférable de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier ClasseA.h
    class ClasseB;
     
    classe ClasseA
    {
    // [...]
     
    ClasseB* pObjet;
    };
    et d'inclure le ClasseB.h dans ClasseA.cpp.

    Hope it's clear

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par r0d
    Alors, pour rester en 1ere vitesse:

    Il faut inclure les .h (fichiers d'en-tête) là où tu en as besoin. C'est à dire:
    un en-tête (ou header) défini une classe (ou des fonctions). Donc lorsque tu vas utiliser une classe, que ce soit dans ton propre header ou dans ton .cpp, tu dois inclure l'en-tête dans lequel elle est définie.

    La deuxième vitesse consiste à utiliser les pare-feu de compilation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //fichier .h
     
    #ifndef MON_EN_TETE_H
    #define MON_EN_TETE_H
    //code
    #endif MON_EN_TETE_H
    Cette mesure sert à éviter d'inclure 2 fois le même header, et elle va s'avérer rapidement indispensable.
    Ce n'est pas un parefeu de compilation, c'est un garde d'inclusion. C'est pas un étape, c'est quasiment indispensable.

    La troisième vitesse consiste à privilégier les déclaration de classe dans les header. Par exemple, au lieu de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier ClasseA.h
    #include "ClasseB.h"
     
    class ClasseA
    {
    // [...]
     
        ClasseB objet;
    };
    il est préférable de faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    //fichier ClasseA.h
    class ClasseB;
     
    classe ClasseA
    {
    // [...]
     
    ClasseB* pObjet;
    };
    et d'inclure le ClasseB.h dans ClasseA.cpp.
    Je ne pousserais pas aussi loin directement; ce choix est un peu un choix de conception, pas une technique d'implémentation. Tout d'abord je ne ferais l'inclusion que si la définition est nécessaire:
    - il y a un membre de ce type,
    - une classe définie dans l'en-tête en hérite.

    Pour revenir au parefeu de compilation, aussi appelé pimpl et cheshire cat idiom, ça consiste à remplacer tout les membres privés par un pointeur vers une classe qui elle sera définie dans le .cpp. Ça permet de découpler totalement l'implémentation de l'interface.

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    désolé pour cette erreur, je suis allé un peu vite en besogne. Et merci pour la correction et les précisions

Discussions similaires

  1. Prob chemins des includes de la lib boost
    Par onap dans le forum C++Builder
    Réponses: 2
    Dernier message: 13/05/2005, 11h56
  2. [Référencement] Gestion des "includes" dans Google
    Par odelayen dans le forum Référencement
    Réponses: 5
    Dernier message: 20/04/2005, 17h07
  3. [WxPython][wx.GridBagSizer]Placement des composants
    Par Guigui_ dans le forum wxPython
    Réponses: 1
    Dernier message: 29/01/2005, 15h46
  4. [JSP] utilisation dynamique des includes
    Par shinchun dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 24/05/2004, 15h28
  5. Placement des balises avec DTD
    Par Keul125 dans le forum Valider
    Réponses: 4
    Dernier message: 28/05/2003, 12h08

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