Working from the 2005-10-19 C++ working draft (since I don't have a standard handy):
Section 16.3 defines the grammar for #define
to be #define identifier replacement-list-newline
(object-like macros) or one of several constructions beginning with #define identifier lparen
(function-like macros). identifier
s are defined in section 2.10 to be identifier-nondigit | identifier identifier-nondigit | identifier digit
. Section 2.11 indicates that a certain list of identifiers are unconditionally treated as keywords in phase 7 of compilation (section 2.1), and I conclude that they are therefore not treated specially in phase 4, which is preprocessor expansion. Thus, it appears that the standard requires the preprocessor to allow you to redefine language keywords (listed in Section 2.11).
However, the preprocessor has a keyword of its own, namely defined
, as well as a list of predefined macros (Section 16.8). Section 16.8 states that the behavior is undefined if you redefine these, but does not prohibit the preprocessor from recognizing these as macro names.