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