Чи можна вкладати директиви попереднього процесора в C ++?


84

У мене запитання про директиви попереднього процесора в 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 ++ однакові, принаймні, що стосується цього питання.
Кіт Томпсон,

Відповіді:


112

Так, ми можемо. Оператор #endifвідповідає попередньому #if #ifdefчи #ifndefіншому, якому не було відповідного #endif.

напр

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

у нас тут є два #endif, тож перший #endif буде відповідати другому #ifndef?

Він не збігатиметься з попереднім; це означало б, що ми не могли їх вкласти.
Fred Foo

49

Так, ви можете вкласти #if/ #endifблокувати. Деякі стилі кодування на С говорять вам писати

#ifdef CONDITION1
# ifdef CONDITION2
# endif
#endif

використання пробілів для позначення рівня вкладеності.


5
+1 для вкладеного біта, це іноді дуже допомагає з ясністю.
Андре Карон,

Чому ви вставляєте пробіл? чому б просто не зробити відступ#ifdef
Джахід

3
Я навіть не знав, що #допускаються пробіли між директивами препроцесора. Велике спасибі за цю пораду!
AlexR

0

У вашому коді розділ #ifndef ПИТАННЯ буде відхилено, якщо ви не #undef ПИТАННЯ.

Удачі!


Вибачте, неправильно прочитав зразок коду! Я думав, це почалося з #ifdef ЗАПИТАННЯ
bert-jan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.