Pre-processing expressions

Pre-processing expressions can occur in #if and #elif directives. The operators !, ==, !=, && and || are permitted in pre-processing expressions, and parentheses may be used for grouping. pp-expression :: whitespace pp-or-expressionwhitespace pp-or-expression :: pp-and-expressionpp-or-expressionwhitespace||whitespace pp-and-expressionpp-and-expression :: pp-equality-expressionpp-and-expressionwhitespace&&whitespace pp-equality-expressionpp-equality-expression :: pp-unary-expressionpp-equality-expressionwhitespace==whitespace pp-unary-expressionpp-equality-expressionwhitespace!=whitespace pp-unary-expressionpp-unary-expression :: pp-primary-expression!whitespace pp-unary-expressionpp-primary-expression :: truefalseconditional-symbol(whitespace pp-expressionwhitespace)
When referenced in a pre-processing expression, a defined conditional compilation symbol has the boolean value true, and an undefined conditional compilation symbol has the boolean value false.
Evaluation of a pre-processing expression always yields a boolean value. The rules of evaluation for a pre-processing expression are the same as those for a constant expression (14.15), except that the only user-defined entities that can be referenced are conditional compilation symbols.