4.2.2 Если
Директива «#if» позволяет проверить значение арифметического выражения, а не просто наличие макроса. Ее синтаксис
#if expression controlled text #endif /* expression */
выражение — это целочисленное выражение языка C, с жёсткими ограничениями. Оно может содержать
- Целочисленные константы.
- Символьные константы, интерпретируемые так же, как и в обычном коде.
- Арифметические операторы сложения, вычитания, умножения, деления, побитовые операции, сдвиги, сравнения и логические операции (
&&и||). Последние два подчиняются обычным правилам короткого замыкания стандартного C. - Макросы. Все макросы в выражении раскрываются перед фактическим вычислением значения выражения.
- Использование оператора
defined, который позволяет проверить, определён ли макрос в середине «#if». - Идентификаторы, которые не являются макросами, все считаются равными нулю. Это позволяет записать
#if MACROвместо#ifdef MACRO, если известно, что MACRO, при определении, всегда будет иметь ненулевое значение. Функциональные макросы, используемые без скобок вызова функции, также обрабатываются как ноль.В некоторых контекстах этот сокращенный способ нежелателен. Опция -Wundef заставляет GCC предупреждать каждый раз, когда встречается идентификатор, который не является макросом, в «#if».
Препроцессор не знает ничего о типах в языке. Поэтому, операторы sizeof не распознаются в «#if», а также enum константы. Они будут приняты за идентификаторы, не являющиеся макросами, и заменены нулём. В случае с sizeof, это, вероятно, приведёт к некорректному выражению.
Препроцессор вычисляет значение выражения. Все вычисления проводятся в самом широком целочисленном типе, известном компилятору; на большинстве машин, поддерживаемых GCC, это 64 бита. Это не то же правило, что компилятор использует для вычисления значения константного выражения, и в некоторых случаях может давать разные результаты. Если значение оказывается ненулевым, «#if» успешно выполняется, и управляемый текст включается; в противном случае он пропускается.
Далее: Определён, Предыдущий: Если определён, Вверх: Синтаксис условных выражений [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-7.5.0/cpp/If.html