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?

Brian Tompsett - 汤 莱恩
źródło
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 --------|
Armen Tsirunyan
źródło
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.

Fred Foo
źródło
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!

bert-jan
źródło
Przepraszamy, błędnie odczytałem przykładowy kod! Myślałem, że zaczęło się od #ifdef PYTANIE
bert-jan