Il ruolo di #ifdef e #ifndef


100
#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:


131

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

68

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

0

"#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.


4
Non sono sicuro di cosa questo aggiunga che le altre risposte non coprono già e il tuo esempio non è C o C ++.
SirGuy

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.