web-dev-qa-db-fra.com

Le rôle de #ifdef et de #ifndef

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

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

79
alka pandey

Le texte contenu dans une paire ifdef/endif ou ifndef/endifsera laissé ou supprimé par le pré-processeur en fonction de la condition. ifdef signifie "si ce qui suit est défini" alors que ifndef signifie "si ce qui suit est pas défini".

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 one est défini, donc ifdef est vrai et ifndef est faux. Peu importe ce que cela définit comme . Un morceau de code similaire (meilleur à mon avis) serait:

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

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

Dans votre cas particulier, le texte après la ifdef n'est pas supprimé, car one est défini. Le texte après la ifndef est supprimé pour la même raison. Il faudra deux lignes de fermeture endif à un moment donné et la première provoquera la reprise de l'inclusion 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
113
paxdiablo

Quelqu'un devrait mentionner que dans la question, il y a un petit piège. #ifdef vérifiera uniquement 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. Tu pourrais 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 l'ancienne paire #ifdef/#ifndef.

#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
57
Patrick Schlüter

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

Il s’agit simplement de la directive du préprocesseur C (CPP) équivalente aux déclarations if, then, d’autres branches en langage C.

ie if {#define one} puis printf ("on évalue en vérité"); else printf ("on n'est pas défini"); donc s'il n'y avait pas de #define one alors la branche else de la déclaration serait exécutée.

1
Rodders

Le code semble étrange car les printf ne sont dans aucun bloc de fonction.

0
hwx