4.2.2 Если
Директива ‘#if’ позволяет проверить значение арифметического выражения, а не просто существование макроса. Синтаксис:
#if expression controlled text #endif /* expression */
expression — это целочисленное выражение C, которое подчиняется строгим ограничениям. Оно может содержать
- Целочисленные константы.
- Символьные константы, которые интерпретируются так же, как и в обычном коде.
- Арифметические операторы сложения, вычитания, умножения, деления, побитовые операции, сдвиги, сравнения и логические операции (
&&и||). Последние две подчиняются обычным правилам короткого замыкания стандартного C. - Макросы. Все макросы в выражении расширяются перед фактическим вычислением значения выражения.
- Использование оператора
defined, который позволяет проверить, определены ли макросы посредине директивы ‘#if’. - Идентификаторы, которые не являются макросами, все считаются равными нулю. Это позволяет написать
#if MACROвместо#ifdef MACRO, если известно, что макрос MACRO, при определении, всегда будет иметь ненулевое значение. Функциональные макросы, используемые без скобок вызова функции, также обрабатываются как ноль.В некоторых контекстах этот ярлык нежелателен. Опция -Wundef заставляет GCC предупреждать всякий раз, когда он встречает идентификатор, который не является макросом в ‘#if’.
Препроцессор не знает ничего о типах языка. Поэтому операторы sizeof не распознаются в ‘#if’, а также константы enum. Они будут восприниматься как идентификаторы, не являющиеся макросами, и заменятся нулём. В случае с sizeof, это, вероятно, приведёт к тому, что выражение станет некорректным.
Препроцессор вычисляет значение expression. Он выполняет все вычисления в самом широком целочисленном типе, известном компилятору; на большинстве поддерживаемых GCC машин это 64 бита. Это не то же правило, что использует компилятор для вычисления значения константного выражения, и в некоторых случаях может давать разные результаты. Если значение оказывается ненулевым, директива ‘#if’ выполняется успешно, и управляемый текст включается; в противном случае он пропускается.
Далее: Определён, Предыдущий: Если определено, Вверх: Условный синтаксис [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/cpp/If.html