2 <clause number="9.5.2" title="Pre-processing expressions">
3 <paragraph>Pre-processing expressions can occur in <symbol>#if</symbol> and <symbol>#elif</symbol> directives. The operators !, ==, !=, && and || are permitted in pre-processing expressions, and parentheses may be used for grouping. <grammar_production><name><non_terminal where="9.5.2">pp-expression</non_terminal></name> :: <rhs><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-or-expression</non_terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/></rhs></grammar_production><grammar_production><name><non_terminal where="9.5.2">pp-or-expression</non_terminal></name> :: <rhs><non_terminal where="9.5.2">pp-and-expression</non_terminal></rhs><rhs><non_terminal where="9.5.2">pp-or-expression</non_terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><terminal>||</terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-and-expression</non_terminal></rhs></grammar_production><grammar_production><name><non_terminal where="9.5.2">pp-and-expression</non_terminal></name> :: <rhs><non_terminal where="9.5.2">pp-equality-expression</non_terminal></rhs><rhs><non_terminal where="9.5.2">pp-and-expression</non_terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><terminal>&&</terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-equality-expression</non_terminal></rhs></grammar_production><grammar_production><name><non_terminal where="9.5.2">pp-equality-expression</non_terminal></name> :: <rhs><non_terminal where="9.5.2">pp-unary-expression</non_terminal></rhs><rhs><non_terminal where="9.5.2">pp-equality-expression</non_terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><terminal>==</terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-unary-expression</non_terminal></rhs><rhs><non_terminal where="9.5.2">pp-equality-expression</non_terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><terminal>!=</terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-unary-expression</non_terminal></rhs></grammar_production><grammar_production><name><non_terminal where="9.5.2">pp-unary-expression</non_terminal></name> :: <rhs><non_terminal where="9.5.2">pp-primary-expression</non_terminal></rhs><rhs><terminal>!</terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-unary-expression</non_terminal></rhs></grammar_production><grammar_production><name><non_terminal where="9.5.2">pp-primary-expression</non_terminal></name> :: <rhs><keyword>true</keyword></rhs><rhs><keyword>false</keyword></rhs><rhs><non_terminal where="9.5.1">conditional-symbol</non_terminal></rhs><rhs><terminal>(</terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><non_terminal where="9.5.2">pp-expression</non_terminal><non_terminal where="9.3.3">whitespace</non_terminal><opt/><terminal>)</terminal></rhs></grammar_production></paragraph>
4 <paragraph>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. </paragraph>
5 <paragraph>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 (<hyperlink>14.15</hyperlink>), except that the only user-defined entities that can be referenced are conditional compilation symbols. </paragraph>