Le rôle de #ifdef et #ifndef


100
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");

En cela, quel est le rôle de #ifdefet #ifndefet quel est le résultat?

Réponses:


131

Le texte à l'intérieur d'une paireifdef/endif ou sera laissé ou supprimé par le pré-processeur en fonction de la condition. signifie "si ce qui suit est défini" tandis que signifie "si ce qui suit n'est pas défini".ifndef/endif ifdefifndef

Alors:

#define one 0
#ifdef one
    printf("one is defined ");
#endif
#ifndef one
    printf("one is not defined ");
#endif

est équivalent à:

printf("one is defined ");

puisque oneest défini ainsi le ifdefest vrai et le ifndefest faux. Peu importe ce qu'il est défini comme . Un morceau de code similaire (meilleur à mon avis) à celui-ci serait:

#define one 0
#ifdef one
    printf("one is defined ");
#else
    printf("one is not defined ");
#endif

puisque cela spécifie plus clairement l'intention dans cette situation particulière.

Dans votre cas particulier, le texte après le ifdefn'est pas supprimé car oneest défini. Le texte après le ifndef est supprimé pour la même raison. Il devra y avoir deux endiflignes de fermeture à un moment donné et la première entraînera le redémarrage des lignes, comme suit:

     #define one 0
+--- #ifdef one
|    printf("one is defined ");     // Everything in here is included.
| +- #ifndef one
| |  printf("one is not defined "); // Everything in here is excluded.
| |  :
| +- #endif
|    :                              // Everything in here is included again.
+--- #endif

68

Quelqu'un devrait mentionner que dans la question il y a un petit piège. #ifdefvérifiera uniquement si le symbole suivant a été défini via #defineou par ligne de commande, mais sa valeur (sa substitution en fait) n'est pas pertinente. Tu pourrais même écrire

#define one

les précompilateurs acceptent cela. Mais si vous l'utilisez, #ifc'est autre chose.

#define one 0
#if one
    printf("one evaluates to a truth ");
#endif
#if !one
    printf("one does not evaluate to truth ");
#endif

donnera one does not evaluate to truth. Le mot-clé definedpermet d'obtenir le comportement souhaité.

#if defined(one) 

équivaut donc à #ifdef

L'avantage de la #ifconstruction est de permettre une meilleure gestion des chemins de code, essayez de faire quelque chose comme ça avec l'ancien #ifdef/ #ifndefpaire.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300

0

"# if one" signifie que si "#define one" a été écrit "# if one" est exécuté, sinon "#ifndef one" est exécuté.

Il ne s'agit que de l'équivalent de la directive sur le pré-processeur C (CPP) des instructions de branche if, then, else en langage C.

c'est-à-dire si {#define one} alors printf ("on évalue à une vérité"); else printf ("on n'est pas défini"); donc s'il n'y avait pas d'instruction #define one, alors la branche else de l'instruction serait exécutée.


4
Je ne sais pas ce que cela ajoute que les autres réponses ne couvrent pas déjà, et votre exemple n'est pas C ou C ++.
SirGuy

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.