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