The declaration directives are used to define or undefine conditional compilation symbols. pp-declaration :: whitespace#whitespacedefinewhitespaceconditional-symbolpp-new-linewhitespace#whitespaceundefwhitespaceconditional-symbolpp-new-linepp-new-line :: whitespacesingle-line-commentnew-line
The processing of a #define directive causes the given conditional compilation symbol to become defined, starting with the source line that follows the directive. Likewise, the processing of an #undef directive causes the given conditional compilation symbol to become undefined, starting with the source line that follows the directive.
Any #define and #undef directives in a source file must occur before the first token (9.4) in the source file; otherwise a compile-time error occurs. In intuitive terms, #define and #undef directives must precede any "real code" in the source file.
[Example: The example: is valid because the #define directives precede the first token (the namespace keyword) in the source file. end example]
[Example: The following example results in a compile-time error because a #define follows real code: end example]
A #define may define a conditional compilation symbol that is already defined, without there being any intervening #undef for that symbol. [Example: The example below defines a conditional compilation symbol A and then defines it again.
For compilers that allow conditional compilation symbols to be defined as compilation options, an alternative way for such redefinition to occur is to define the symbol as a compiler option as well as in the source. end example]
A #undef may "undefine" a conditional compilation symbol that is not defined. [Example: The example below defines a conditional compilation symbol A and then undefines it twice; although the second #undef has no effect, it is still valid. end example]