#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
#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
texte à l'intérieur d'un ifdef/endif
ou ifndef/endif
paire 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 ifndef
est 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
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
« #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.
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