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