Следует ли определять макрос, используемый в #if? - PullRequest
6 голосов
/ 19 сентября 2019
# if RTC

/* some code */

# endif

Должен ли макрос RTC быть определен со значением?Мой компилятор не выдает ошибку.Все ли компиляторы делают то же самое?Разве определение макроса не безопаснее?

Ответы [ 2 ]

6 голосов
/ 19 сентября 2019

В директиве предварительной обработки, такой как эта, если макрос не определен, он обрабатывается как 0.

Это гарантировано языком.

Вы можете положиться на негоне является ошибкой компиляции.

Вот формулировка C ++:

[cpp.cond]/11: после всех замен из-за расширения макроса и определения определены-macro-выражения , has-include-выражения и has-attribute-expression выполнено, все остальные идентификаторы и ключевые слова, кроме trueи false заменяются на pp-номер 0, а затем каждый токен предварительной обработки преобразуется в токен. [..]

1 голос
/ 19 сентября 2019

Нет, это не нужно определять.Если идентификатор не определен в конце расширения #if, он оценивается как 0.

Из ANSI C90:

После всех замен из-за расширения макроса иdefined был выполнен унарный оператор, все оставшиеся идентификаторы заменены на номер pp 0.

Это, однако, может отсутствовать в компиляторах до стандартизации C.Однажды я увидел предупреждение GCC об этом (я думаю, что это было на MinGW), но я не могу найти источник для него прямо сейчас.

Вывод: Все совместимые со стандартами компиляторы C должныне выдавайте ошибку при встрече с этим.Вам не нужно определять макрос перед его использованием в #if.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...