Могут ли директивы препроцессора #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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.