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 :

ifndef ? bizarre ..


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 53
    Par défaut ifndef ? bizarre ..
    Bonjour,
    j'ai commencé le c il n'y a pas longtemps, et il y a quelque chose que je ne comprends pas avec ifndef !!!

    Si par exemple on a un fichier A.h et un fichier B.h. Le fichier A.h contient un include du fichier B.h. Le fichier B est donc inclus dans le fichier A.
    Mais, et c'est là le hic, supposez que le fichier B.h contienne à son tour un include du fichier A.h ? Le premier fichier a besoin du second pour fonctionner, et le second a besoin du premier.

    Jusque la tout va bien, je comprends l'interet de ifndef.

    Mais si on vient rajouter un fichier C.h dans tout cela, et que ce fichier contient un include du fichier A.h, je ne comprends plus car :
    le fichier A.h et B.h auront été fermé car leurs constantes ont été définie !
    Dans ce cas comment le fichier C.h pourrait utiliser A.h ?

    C'est un peu confus, mais je pense avoir exprimé mon incompréhension

    Merci d'avance !!

  2. #2
    Membre émérite
    Avatar de thecaptain
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Décembre 2003
    Messages
    919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Décembre 2003
    Messages : 919
    Par défaut
    Salut et bienvenue sur Développez

    De mes modestes connaissances de C++, il me semble que la 1ère chose que fait le compilateur, c'est de regrouper toutes les classes dans un seul fichier pour la compilation. Le ifndef sert justement à lui dire de copier ou non telle ou telle classe. Une fois que tout est dans le fichier, la il commence tout le tralala des vérification. Donc du coup, tout dépend de la hiérarchie des tes include et comment tu les définis

    @++

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 464
    Par défaut
    Le rôle de #ifndef xxx n'est pas d'empêcher les inclusions, mais d'empêcher des inclusions multiples d'un point de vue donné.

    Donc, par exemple, si du point de vue de C.h, A.h n'est pas encore connu, alors il sera inclus (une fois et une seule), ce même si A.h a déjà été inclus dans B.h auparavant et est donc fermé, pour reprendre ton expression, mais ... du point de vue de B.h, mais pas (encore) de celui de C.h.

    C'est clair ?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 53
    Par défaut
    ah ok,

    je pensais qu'il serait fermé pour le programme en général mais s'il l'est juste pour un des fichiers ça change tout !!

    merci beaucoup !!

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    Salut,

    Il est peut etre déjà intéressant de bien comprendre ce que sont les instructions préprocesseur pour pouvoir comprendre la suite...

    N'oublions jamais qu'un compilateur C, ca a beau etre perfectionné, il ne peut utiliser que ce qu'il connait, et que, en dehors de toutes structures de controle et de toutes boucles, il lira le fichier "de haut en bas et de gauche à droite".

    Quand tu fais un
    le préprocesseur va remplacer la ligne par le contenu complet du fichier a.h dans le code qu'il va compiler

    Il ne s'agit donc pas d'avoir un fichier quelconque fermé nulle part

    Et c'est pourquoi une instruction préprocesseur #include doit se trouver en début de fichier (pour etre sur que son contenu soit connu dans tout le fichier à compiler).

    Les instructions #ifdef et #ifndef ne sont à vrai dire que des structures de controle pour le préprocesseur au meme titre que le if(condition) l'est dans ton code C...

    Quand il passe d'un fichier à compiler à l'autre, le préprocesseur oublie tout ce qu'il a fait...

    Donc, au moment de compiler a.c, le préprocesseur tombe sur un code ressemblant à ceci (du fait du #include "a.h" dans a.c)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifdef A_H
    //ne fait rien si A_H est connu
    #endif
    ifndef A_H
    #define A_H
    #include "b.h"
    ...
    #endif
    Hé bien, il fait ce qu'on lui demande.

    Comme il ne connait pas A_H, il fait ce qu'il trouve apres le #ifndef.

    Pas de bol, la premiere instruction qu'il rencontre, c'est d'inclure b.h...

    Hé bien, il l'inclu, comme il ne connait pas B_H, il va effectuer les instructions du #ifndef, dont l'inclusino de a.h (mais la, il connaitra A_H, et ne fera donc... rien du tout vu qu'il passera dans la partie #ifdef de a.h )

    Une fois à ce point, il en aura fini avec les inclusions (s'il y a d'autre définitions, il les prendra en compte )

    Apres avoir compilé a.c, le compilateur passe à b.c (ou du moins, on va estimer qu'il travaillera dans cet ordre pour l'exemple )

    Entre la compilation de a.c et celle de b.c, ben, tout ce qui a été défini pour permettre la compilation de a.c a été oublié, et il fera exactement le meme travail, mais au départ de b.c.

    Pour terminer, le compilateur s'attaquera à c.c, dans lequel il trouvera l'inclusion de c.h, qui lui meme demandera l'inclusion de a.h qui demandera l'inclusion de b.h (qui ne demandera plus l'inclusion de a.h, A_H étant définie à ce moment là)

    Le tour sera joué, chaque fichier disposant, au moment de la compilation, de tout ce dont il a besoin pour pouvoir travailler
    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 confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2006
    Messages : 53
    Par défaut
    aaah, ok

    Merci beaucoup !!

    maintenant c'est bien clair en tout cas !!

    Merci !!

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 237
    Par défaut
    Il y a quelque chose que je ne comprend pas..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    #ifdef A_H
    //ne fait rien si A_H est connu
    #endif
    ifndef A_H
    #define A_H
    #include "b.h"
    ...
    #endif
    Quel est l'interêt du ifdef?

    Si a.h est defini, alors il ne fera rien avec ou sans le ifdef ( a condition que le endif se trouve a la fin du fichier...)
    S'il n'est pas defini, il ira dans tous les cas dans le ifndef, non?

  8. #8
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par vince3320
    Quel est l'interêt du ifdef?
    Aucun, c'est pour montrer que cela existe et pour faciliter la comprehension.
    Dans un header file, il suffit de mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #ifndef H_FILE
    #define H_FILE
     
    #endif
    pour le proteger contre les inclusions multiples.

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 641
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 641
    Par défaut
    C'est tout à fait...

    mais tu pourrais très bien imaginer un truc du genre de
    "maintenant que je connais A_H et B_H, je fait une chose particulière"... qui sera effectuée de manière systématique, chaque fois que tu auras un #include a.h dans tes fichiers

    Tu pourra utiliser tous tes #define quelque chose pour faire un test au niveau du préprocesseur...

    Par exemple, permettre une compatibilité entre windows et linux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    //du code pour toutes les architectures
    #ifdef WINDOWs
        // du code à utiliser uniqueme quand c'est pour windows
    #else ifdef LINUX
        // du code à utiliser uniquement quand c'est pour linux
    #else ifdef __64bits
       //du code à utiliser uniquement pour les architectures 64 bits
    #endif
    //encore du code pour toutes les architectures
    et ca pourrait très bien etre dans le fichier .h, pour faire inclure d'autres fichiers d'entetes spécifiques à la plateforme ou à l'architecture
    (les valeurs utilisées pour les ifdef sont purement imaginaires )

    EDIT==> j'ai été pris de vitesse...
    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

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

Discussions similaires

  1. problèmes bizarres avec jdbc
    Par jaimepasteevy dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 12/12/2003, 12h00
  2. taille de structure bizarre ...
    Par lyrau dans le forum C
    Réponses: 3
    Dernier message: 20/11/2003, 10h46
  3. Pourquoi ces directives #ifndef ... en haut des .h
    Par Patrick PETIT dans le forum C
    Réponses: 8
    Dernier message: 06/03/2003, 23h53
  4. Un String Bizarre
    Par YanK dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 11h05
  5. Réponses: 4
    Dernier message: 28/09/2002, 00h00

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