#define one 0
#ifdef one
printf("one is defined ");
#ifndef one
printf("one is not defined ");
In questo qual è il ruolo di #ifdefe #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 #ifdefe #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 ifdefifndef
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 ifdefsia vero e ifndefsia 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 ifdefnon viene rimosso poiché oneè definito. Il testo dopo il ifndef viene rimosso per lo stesso motivo. Ad un endifcerto 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. #ifdefcontrollerà solo se il seguente simbolo è stato definito tramite #defineo 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 definedconsente di ottenere il comportamento desiderato.
#if defined(one)
è quindi equivalente a #ifdef
Il vantaggio del #ifcostrutto è 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.