2010-09-19 7 views
63
#define one 0 
#ifdef one 
printf("one is defined "); 
#ifndef one 
printf("one is not defined "); 

Dans ce quel est le rôle de #ifdef et #ifndef, et quelle est la sortie?Le rôle de #ifdef et #ifndef

Répondre

96

texte à l'intérieur d'un ifdef/endif ou ifndef/endifpaire sera laissé en place ou enlevé par le pré-processeur en fonction de la condition. ifdef signifie "si ce qui suit est défini" tandis que ifndef signifie "si ce qui suit est et non".

Alors:

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

équivaut à:

printf("one is defined "); 

depuis one est définie de sorte que le ifdef est vrai et le faux est ifndef. Peu importe ce qu'il est défini comme. Un morceau similaire (mieux à mon avis) de code à ce serait:

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

depuis qui spécifie l'intention plus clairement dans cette situation particulière.

Dans votre cas particulier, le texte après le ifdef n'est pas supprimé car one est défini. Le texte après le ifndefest supprimé pour la même raison. Il faudra être deux endif lignes de fermeture à un moment donné et la première causeront lignes commencent à être inclus à nouveau, 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 
48

Quelqu'un doit mentionner que la question il y a un petit piège. #ifdef ne vérifiera que si le symbole suivant a été défini via #define ou par ligne de commande, mais sa valeur (sa substitution en fait) est sans importance. Vous pouvez même écrire

#define one 

les précompilateurs acceptent cela. Mais si vous utilisez #if c'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é defined permet d'obtenir le comportement souhaité.

#if defined(one) 

est donc équivalent à #ifdef

L'avantage de la construction #if est de permettre une meilleure gestion des chemins de code, essayez de faire quelque chose comme ça avec la vieille paire #ifdef/#ifndef.

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

« #if un » signifie que si « un #define » a été écrit « #if un » est exécuté autrement « #ifndef un » est exécuté.

Ceci est juste l'équivalent C de la directive du pré-processeur (CPP) des instructions de branchement if, then, else dans le langage C.

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

+3

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

Questions connexes