Операндами в операторах #if
могут быть только константы, вещи, определенные с помощью #define
, и специальный оператор defined
.Любые другие идентификаторы в выражении заменяются на 0. x
в вашем примере кода не определено с #define
, поэтому (x==5)
становится (0==0)
.
В стандарте C 2018, п. 6.10.1 говорит нам, что оценка выражения в операторе #if
включает:
- Макросы препроцессора (вещи, определенные с помощью
#define
) заменяются в соответствии с их определениями. - Используетоператора
defined
заменяются на 0 или 1. - Все остальные идентификаторы заменяются на 0.
, поскольку x
в вашем примере кода не определено с помощью #define
, он заменяется на 0 в выражении #if
.В результате получается (0==5)
, что неверно, поэтому код между #if
и #else
пропускается.
В операторе препроцессора нельзя вычислять переменные на основе значений, которые будут установлены во время программывыполнение.