#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
En cela, quel est le rôle de #ifdef
et #ifndef
et quel est le résultat?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
En cela, quel est le rôle de #ifdef
et #ifndef
et quel est le résultat?
Réponses:
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
ifdef
ifndef
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 ainsi le ifdef
est vrai et le ifndef
est 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 ifdef
n'est pas supprimé car one
est défini. Le texte après le ifndef
est supprimé pour la même raison. Il devra y avoir deux endif
lignes 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
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) n'est pas pertinente. Tu pourrais même écrire
#define one
les précompilateurs acceptent cela. Mais si vous l'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)
équivaut donc à #ifdef
L'avantage de la #if
construction est de permettre une meilleure gestion des chemins de code, essayez de faire quelque chose comme ça avec l'ancien #ifdef
/ #ifndef
paire.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"# 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.
Le code semble étrange car les printf ne sont dans aucun bloc fonction.