#If le direttive del pre-processore possono essere annidate in C ++?


85

Ho una domanda sulle direttive del pre-processore in c ++:

Per esempio:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

Possiamo usarlo in questo modo e il compilatore C ++ può abbinare ifndefe endifnel modo giusto?


1
Puoi nidificare condizionali e puoi chiamare una macro da un'altra ma non puoi nidificare le macro direttamente, ad esempio #define AAA #define XXX, non funzionerà correttamente.
SF.

2
Poiché una domanda C è stata appena chiusa come duplicato di questa, farò notare che le regole per il preprocessore C e C ++ sono le stesse, almeno per quanto riguarda questa domanda.
Keith Thompson

Risposte:


113

Sì possiamo. L' #endifistruzione corrisponde alla precedente #if #ifdefo #ifndefecc. Per la quale non c'è stata una corrispondente #endif.

per esempio

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|

abbiamo due #endif qui, quindi il primo #endif corrisponderà al secondo #ifndef?

Non corrisponderà al precedente; ciò significherebbe che non potremmo annidarli.
Fred Foo

49

Sì, puoi annidare #if/ #endifbloccare. Alcuni stili di codifica C ti direbbero di scrivere

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

utilizzando spazi per indicare il livello di nidificazione.


5
+1 per il pezzo di nidificazione, a volte aiuta molto con chiarezza.
André Caron

Perché dovresti inserire lo spazio? perché non #ifdef
inserire

3
Non sapevo nemmeno che gli spazi tra #e le direttive del preprocessore fossero consentiti. Grazie mille per quel suggerimento!
AlexR

0

Nel tuo codice, la sezione #ifndef DOMANDA verrà scartata a meno che tu non #undef DOMANDA.

In bocca al lupo!


Spiacenti, ho letto male il codice di esempio! Pensavo fosse iniziato con #ifdef DOMANDA
bert-jan
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.