ECMA-334 C# Language Specification9.5.3: Declaration directives |
The declaration directives are used to define or undefine conditional compilation symbols.
whitespaceopt # whitespaceopt define whitespace conditional-symbol pp-new-line whitespaceopt # whitespaceopt undef whitespace conditional-symbol pp-new-line whitespaceopt single-line-commentopt new-lineThe 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.
is valid because the
#define Enterprise
#if Professional || Enterprise
#define Advanced
#endif
namespace Megacorp.Data
{
#if Advanced
class PivotTable {...}
#endif
}
#define directives precede the first token (the namespace keyword) in the source file. end example]
#define follows real code:
end example]
#define A
namespace N
{
#define B
#if B
class Class1 {}
#endif
}
A #define may define a conditional compilation symbol that is already defined, without there being any intervening #undef for that symbol.
#define A
#define A
A #undef may "undefine" a conditional compilation symbol that is not defined. #undef has no effect, it is still valid.
end example]
#define A
#undef A
#undef A