#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
In questo qual è il ruolo di #ifdef
e #ifndef
, e qual è l'output?
#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
In questo qual è il ruolo di #ifdef
e #ifndef
, e qual è l'output?
Risposte:
Il testo all'interno di una coppiaifdef/endif
o verrà lasciato o rimosso dal preprocessore a seconda delle condizioni. significa "se quanto segue è definito" mentre significa "se quanto segue non è definito".ifndef/endif
ifdef
ifndef
Così:
#define one 0
#ifdef one
printf("one is defined ");
#endif
#ifndef one
printf("one is not defined ");
#endif
è equivalente a:
printf("one is defined ");
poiché one
è definito in modo che ifdef
sia vero e ifndef
sia falso. Non importa quello che è definito come . Un pezzo di codice simile (meglio secondo me) a quello sarebbe:
#define one 0
#ifdef one
printf("one is defined ");
#else
printf("one is not defined ");
#endif
poiché ciò specifica l'intento più chiaramente in questa particolare situazione.
Nel tuo caso particolare, il testo dopo il ifdef
non viene rimosso poiché one
è definito. Il testo dopo il ifndef
viene rimosso per lo stesso motivo. Ad un endif
certo punto dovranno esserci due righe di chiusura e la prima farà sì che le righe ricomincino ad essere incluse, come segue:
#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
Qualcuno dovrebbe menzionare che nella domanda c'è una piccola trappola. #ifdef
controllerà solo se il seguente simbolo è stato definito tramite #define
o dalla riga di comando, ma il suo valore (la sua sostituzione in effetti) è irrilevante. Potresti persino scrivere
#define one
i precompilatori lo accettano. Ma se usi #if
è un'altra cosa.
#define one 0
#if one
printf("one evaluates to a truth ");
#endif
#if !one
printf("one does not evaluate to truth ");
#endif
darà one does not evaluate to truth
. La parola chiave defined
consente di ottenere il comportamento desiderato.
#if defined(one)
è quindi equivalente a #ifdef
Il vantaggio del #if
costrutto è quello di consentire una migliore gestione dei percorsi del codice, provare a fare qualcosa del genere con la vecchia coppia #ifdef
/ #ifndef
.
#if defined(ORA_PROC) || defined(__GNUC) && __GNUC_VERSION > 300
"#if one" significa che se è stato scritto "#define one" viene eseguito "#if one" altrimenti viene eseguito "#ifndef one".
Questa è solo l'equivalente della direttiva C Pre-Processor (CPP) delle istruzioni del ramo if, then, else nel linguaggio C.
cioè se {#define one} allora printf ("si valuta una verità"); else printf ("uno non è definito"); quindi se non ci fosse #define un'istruzione, verrebbe eseguito il ramo else dell'istruzione.
Il codice sembra strano perché printf non si trova in alcun blocco funzione.