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 #ifdef et #ifndef [Débutant(e)]


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Par défaut Question sur #ifdef et #ifndef
    Bonjour,

    je me posai une question a propos de ces directives, en effet, si j'utilise la directive #ifndef, si je comprends bien, je pourrais mettre n'importe quoi à cote et le code en dessous sera executé? donc les instructions suivantes sont les memes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef TOTO
    instruction
    #endif
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef TATA
    instruction
    #endif
    quel est donc linteret d'une telle directive?
    par ailleurs, est il possible de renvoyer une erreur en utilisant ces directives? si oui de quelle maniere? par exemple, j'ai fait le bout de code suivant, mais je ne suis pas sur qu'il renvoie quelquechose etant donné que la vérification est faite avant la compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #ifndef XXX
    if (sizeof(toto) < sizeof(tata))
    { return E_FALSE }
    #endif
    merci d'avance pour vos eclaircissements!!!

  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
    Si tu veux carrément que du code ne soit pas compilé, utilise directement #if 0 plutôt que #ifdef UN_TRUC_QUI_NE_SERA_JAMAIS_DEFINI...

    Les #ifdef/#ifndef servent principalement pour deux choses:
    • Compiler certains bouts de code et pas d'autres, dépendant de la plate-forme :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      #ifdef WIN32
      #define SleepSeconds(x) Sleep((x)*1000)
      #else
      #define SleepSeconds(x) sleep(x)
      #endif
    • Faire des gardes d'inclusion pour empêcher qu'un fichier d'en-tête cause des conflits en définissant deux fois la même chose:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      #ifndef TYPEDEF_MONTYPE_DEFINI
      #define TYPEDEF_MONTYPE_DEFINI
      typedef struct { int quelqueChose; } MONTYPE;
      #endif
    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
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    et pour le cas que tu cites, c'est aussi :

    quand tu as besoin pour du débogage de faire exécuter une partie du code et pas une autre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #ifdef TOTO
    .... instruction1
    ....  /* Ne s'éxécutera pas */
    #else
       instruction2
    ...
    #endif
    est équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #ifndef TOTO
    ..... instruction2 /* S'exécutera */
    #else
    .... instruction1
    #endif

  4. #4
    Membre averti
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Par défaut
    Merci de votre aide, c'est deja beaucoup plus clair!!
    une derniere petite precision cependant, est-il possible que je signale une erreur lors de la compilation plutot que de retourner quelquechose comme dans mon code precedent, en fait j'aimerais savoir comment faire pour :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #ifndef TOTO
    if (sizeof(toto) < sizeof(tata))
     
    renvoyer erreur compil
     
    #endif
    est ce possible?
    merci beaucoup en tout cas!!

  5. #5
    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
    On ne peut pas faire de #if sur sizeof.

    Mais on peut tricher avec un typedef de tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int VERIF_SIZEOF_TOTO_TATA[ (sizeof(toto) >= sizeof(tata)) ? 1 : -1 ];
    Si sizeof(toto)<sizeof(tata), le typedef de tableau aura une taille négative et causera une erreur de compilation.
    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.

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    151
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 151
    Par défaut
    En fin de page tu peux trouver ce qui t'intéresse :
    Wiki Book C

  7. #7
    Membre averti
    Inscrit en
    Août 2006
    Messages
    42
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 42
    Par défaut
    Merci,
    cependant jai du mal à comprendre ta ligne de code medinoc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef int VERIF_SIZEOF_TOTO_TATA[ (sizeof(toto) >= sizeof(tata)) ? 1 : -1 ];
    faut il la mettre dans une directive de compilation par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifndef TOTO
    typedef int VERIF_SIZEOF_TOTO_TATA[ (sizeof(toto) >= sizeof(tata)) ? 1 : -1 ];
    #endif
    ou faut il definir une macro?

    n'est il pas possible de faire comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #ifdef sizeof(toto) >= sizeof(tata)
    instruction
    #endif
    merci beaucoup en tout cas de votre aide!!!

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

    Informations professionnelles :
    Activité : aucun

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

    Les instructions ifdef et ifndef parlent presque d'elles meme...

    Elles indiquent au préprossesseur que la partie qui se trouvent entre le #ifdef (ou le #ifndef) et le #endif (ou le #else) devra etre pris en compte si la valeur indiquée est définie (pour ifdef: IF DEFined) ou, au contraire, si elle n'est pas définie (pour le ifndef: IF NOT DEFined)

    L'idée, c'est que certaines valeurs peuvent etre définies par le prépocesseur en plein d'endroit différents, dont principalement, dans un fichier d'entete inclus ou dans la ligne de commande du compilateur.

    On peut donc, s'en servir, comme l'a signalé médinoc, pour vérifier la cible de la compilation (avec #ifdef WIN32) ou pour empecher les conflit (avec #ifnedef... #define...), mais aussi, pour gérer certaines options passées pour la compilation.

    Ainsi on pourrait avoir un code du genre de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    /* les deux lignes suivantes évitent les conflits d'inclusion /*
    #ifndef MON_FICHIER_H
    #define MON FICHIER_H
    #inlcude "autre fichier .h"
    /* sera pris en compte si on a passé -DTOTO au compilateur */
        #ifdef TOTO
            /* quelque chose */
        #else
            /* autre chose */
        #endif /*fin du ifdef TOTO */
     /* sera pris en compte si, par le jeu d'inclusions, WIN32 est défini ailleurs */
        #ifdef WIN32
            /* une série d'instructions */
        #else
            /* une autre série d'instructions */
        #endif /* fin du ifdef WIN32 */
    /* on peut prévoir de passer -DTATA au compilateur */
        #ifdef TATA
            /* blabla */
        #else
           /* truc */
        #endif /* fin du ifdef TATA */
    #endif /*fin du ifdef MON_FICHIER_H */
    Et, en définitive, rien n'empecherait d'envisager la compilation croisée en définissant toto et tata avec une instruction de compilation proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc /*...*/ -DWIN32 -DTOTO -DTATA /*...*/
    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. [debutant] Questions sur 1 futur projet
    Par cyrull22 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 28/04/2003, 21h49
  2. Quelques questions sur le TWebBrowser...
    Par CorO dans le forum Web & réseau
    Réponses: 3
    Dernier message: 17/01/2003, 21h23
  3. Question sur les handles et les couleurs...
    Par MrDuChnok dans le forum C++Builder
    Réponses: 7
    Dernier message: 29/10/2002, 08h45
  4. Réponses: 2
    Dernier message: 11/08/2002, 21h27
  5. question sur les message box !
    Par krown dans le forum Langage
    Réponses: 7
    Dernier message: 02/08/2002, 16h11

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