Czy dyrektywy #if preprocesora można zagnieżdżać w C ++?


84

Mam pytanie dotyczące dyrektyw preprocesora w języku c ++:

Na przykład:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

Czy możemy tego użyć w ten sposób i czy kompilator C ++ może dopasować ifndefi endifwe właściwy sposób?


1
Możesz zagnieżdżać warunki warunkowe i wywoływać jedno makro z innego, ale nie możesz zagnieżdżać makr bezpośrednio, np. #define AAA #define XXX- nie będzie działać poprawnie.
SF.

2
Ponieważ pytanie w C zostało właśnie zamknięte jako duplikat tego, wskażę, że reguły dla preprocesorów C i C ++ są takie same, przynajmniej jeśli chodzi o to pytanie.
Keith Thompson

Odpowiedzi:


112

Tak możemy. Te #endifmecze oświadczenie do poprzedniego #if #ifdeflub #ifndefetc, dla których nie było odpowiedniego #endif.

na przykład

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

mamy tutaj dwa #endif, więc pierwszy #endif będzie pasował do drugiego #ifndef?

Nie będzie pasować do poprzedniego; oznaczałoby to, że nie możemy ich zagnieździć.
Fred Foo,

49

Tak, możesz zagnieżdżać #if/ #endifblokować. Niektóre style kodowania w C sugerują pisanie

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

użycie spacji do oznaczenia poziomu zagnieżdżenia.


5
+1 za zagnieżdżenie, czasami bardzo pomaga.
André Caron

Dlaczego wstawiasz spację? dlaczego nie po prostu wciąć#ifdef
Jahid

3
Nie wiedziałem nawet, że spacje między #dyrektywami preprocesora są dozwolone. Wielkie dzięki za tę wskazówkę!
AlexR

0

W Twoim kodzie sekcja #ifndef QUESTION zostanie odrzucona, chyba że #undef QUESTION.

Powodzenia!


Przepraszamy, błędnie odczytałem przykładowy kod! Myślałem, że zaczęło się od #ifdef PYTANIE
bert-jan
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.