Могут ли директивы препроцессора #if быть вложенными в C ++?

85

У меня вопрос о директивах препроцессора в c ++:

Например:

#ifndef QUESTION

//some code here

#ifndef QUESTION

//some code here

#endif

#endif

Можем ли мы использовать его таким образом, и может компилятор C ++ соответствовать ifndefи endifв правильном направлении?

Брайан Томпсетт - 莱恩
источник
1
Вы можете вкладывать условные выражения, и вы можете вызывать один макрос из другого, но вы не можете вкладывать макросы напрямую, например, #define AAA #define XXXэто не будет работать правильно.
SF.
2
Поскольку вопрос C был просто закрыт как дубликат этого, я отмечу, что правила для препроцессоров C и C ++ одинаковы, по крайней мере, в том, что касается этого вопроса.
Кейт Томпсон,

Ответы:

113

Да мы можем. В #endifзаявлении матчи к предыдущему #if #ifdefили #ifndefт.п. , для которых не была соответствующей #endif.

например

#if  ----------|
#if  -----|    |
#endif ---|    |
#endif --------|
Армен Цирунян
источник
у нас есть два #endif здесь, поэтому первый #endif будет соответствовать второму #ifndef?
Он не будет соответствовать предыдущему; это означало бы, что мы не могли их гнездить.
Fred Foo
49

Да, можно вкладывать #if/ #endifблоки. Некоторые стили кодирования C рекомендуют вам написать

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

использование пробелов для обозначения уровня вложенности.

Фред Фу
источник
5
+1 за бит вложенности, иногда очень помогает с ясностью.
Андре Карон
Зачем вам вставлять пробел? почему бы просто не сделать отступ?#ifdef
Джахид
3
Я даже не знал, что между #директивами препроцессора и разрешены пробелы . Большое спасибо за совет!
AlexR
0

В вашем коде раздел #ifndef QUESTION будет удален, если вы не #undef QUESTION.

Удачи!

Берт-Ян
источник
К сожалению, неправильно прочитал образец кода! Я думал, что это началось с #ifdef ВОПРОС
bert-jan