Declaration directives

The declaration directives are used to define or undefine conditional compilation symbols. pp-declaration :: whitespace#whitespace define whitespaceconditional-symbolpp-new-linewhitespace#whitespace undef whitespaceconditional-symbolpp-new-linepp-new-line :: whitespace single-line-comment new-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: #define Enterprise #if Professional || Enterprise #define Advanced #endif namespace Megacorp.Data { #if Advanced class PivotTable {...} #endif } 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: #define A namespace N { #define B #if B class Class1 {} #endif } 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. #define A #define A
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. #define A #undef A #undef A end example]