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 :: whitespacepp-or-expressionwhitespacepp-or-expression :: pp-and-expressionpp-or-expressionwhitespace||whitespacepp-and-expressionpp-and-expression :: pp-equality-expressionpp-and-expressionwhitespace&&whitespacepp-equality-expressionpp-equality-expression :: pp-unary-expressionpp-equality-expressionwhitespace==whitespacepp-unary-expressionpp-equality-expressionwhitespace!=whitespacepp-unary-expressionpp-unary-expression :: pp-primary-expression!whitespacepp-unary-expressionpp-primary-expression :: truefalseconditional-symbol(whitespacepp-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.