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