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 :

Question sur les inclusions de fichier.


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut Question sur les inclusions de fichier.
    Bonsoir à tous.
    Disons que j'ai ce schéma de construction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "Cx.h"
    #include "CY.h"
    #include "CZ.h"
     
    class CA
    {
    //...
    };
    puis une deuxieme classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "CA.h"
    
    //#include "Cx.h"
    //#include "CY.h"--->la raison de ma question
    //#include "CZ.h"
    
    class CB
    {
    //....
    CA m_a;
    //...
    };
    {
    Maintenant lorsque je compile sans "dé-commenté" ce qui est en rouge, j'obtiend un message du genre:
    In class CB m_a as incomplete type
    Je pensais qu'en incluant "CA.h" dans le .h de CB, CX Y et Z etaient sous-entendu.
    Y a-t'il une façon de faire en sorte que ce le soit?
    Auriez-vous des liens vers des articles détaillés sur le sujet?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Tu te trouve face à une situation que l'on appelle l'inclusion multiple...

    Pour comprendre ce qui se passe, il faut savoir que, lorsque le préprocesseur rencontre une directive #include, il va la remplacer purement et simplement par... le contenu du fichier inclus...

    En plus, il va le faire de manière récursive (si A inclus B, que B inclus C et que C inclus D, on retrouvera dans A le contenu de B, de C et de D )

    Cela signifie aussi que, si un fichier (Z) inclus A et B et que, de son coté, A inclus B, tu va te retrouver avec... deux fois le contenu de B ...

    Le résultat, c'est que tu trouvera dans Z deux fois le contenu de B (dont une fois qui vient de A), et que tu va de facto ne plus respecter la règle de la définition unique

    Pour éviter ce problème, il faut prévoir des "gardes anti inclusion multiple" (GuardDogs en anglais).

    Il "suffit" de choisir un identifiant qui sera unique (le plus souvent, on choisi le nom du fichier, extension comprise, en remplaçant tous les caractères qui ne sont pas alpha-numériques par des underscores "_" ) et de l'utiliser sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef NOM_DU_FICHIER_HPP
    #define NOM_DU_FICHIER_HPP
    /* le contenu de fichier.hpp */
    /*...*/
     
    #endif // fin du ifndef NOM_DU_FICHIER_HPP
    Mais fais également attention au problème des références circulaires entre les différentes classes
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Bonsoir.
    En fait je ne crois pas que ce soit un problème d'inclusion multiple car j'utilise systématique les directives "#ifndef" "#define" et "#endif" mais j'ai oublié de les inscrire dans mon schéma...

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    J'ai également regardé du côté des inclusions cycliques et je ne pense pas que ce soit l'explication puisqu'il me suffit d'ajouter des "#include "qqch.h" dans la déclaration de ma classe pour que le compilateur accepte.
    Peut-être faudrait-il que je poste un peu de mon code mais j'ai peur que ce soit volumineux...

  5. #5
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    L'autre possibilité, que j'ai effleurée dans ma première réponse, est le risque de dépendances croisées (cycliques) entre les différentes classes

    Mais ce n'est, malheureusement, pas, avec le peu de code que tu nous a donné que nous serons en mesure de confirmer / infirmer ce fait

    Si ce terme ne signifie rien pour toi, je te conseille de faire un tour du coté de la question de la FAQ qui traite du problème
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  6. #6
    Membre régulier
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Points : 97
    Points
    97
    Par défaut
    Bonjour!
    J'ai lu les liens que tu m'as donné et je suis quasiment sûr qu'il ne s'agit pas de ça.
    Par Contre, en compilant le même projet sous ubuntu 8.10, le compilateur n'a pas bronché.... J'ai en fait déjà constater que sous Fedora 10, mon autre OS, le compilateur etait moins permissif.
    L'explication ne serait-elle pas à chercher de ce côté là?
    P.S.:
    J'ai vraiment la flemme de mettre en ligne le code. Ça me demanderait une mise en page interminable...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. question sur les gestionnaire de fichier
    Par kripteks dans le forum C
    Réponses: 3
    Dernier message: 07/04/2015, 15h17
  2. Question sur les inclusions
    Par Sekigawa dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 03/04/2008, 11h52
  3. [AIX] Une question sur les fichiers
    Par Bahan dans le forum AIX
    Réponses: 1
    Dernier message: 11/04/2007, 08h59
  4. [RegEx] Question sur les fichiers
    Par xdoreau dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2007, 09h55
  5. Questions sur les fichiers Ressource .RC .RES
    Par dexterz dans le forum Langage
    Réponses: 10
    Dernier message: 01/08/2005, 10h15

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