#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?
Le texte contenu dans une paire ifdef/endif
ou ifndef/endif
sera 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
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
"#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.
Le code semble étrange car les printf ne sont dans aucun bloc de fonction.