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-13.3.0/cpp/If.html