Работа с 2005-10-19 C ++ рабочий проект (так как у меня нет стандартного подручного):
В разделе 16.3 грамматика для #define
определяется как #define identifier replacement-list-newline
(объектные макросы) или одна из нескольких конструкций, начинающихся с #define identifier lparen
(функциональные макросы). identifier
s определены в разделе 2.10 как identifier-nondigit | identifier identifier-nondigit | identifier digit
. В разделе 2.11 указано, что определенный список идентификаторов безусловно рассматривается как ключевые слова на этапе 7 компиляции (раздел 2.1), и я заключаю, что поэтому они не обрабатываются специально на этапе 4, который является расширением препроцессора. Таким образом, похоже, что стандарт требует, чтобы препроцессор позволил вам переопределить ключевые слова языка (перечисленные в разделе 2.11) .
Однако препроцессор имеет собственное ключевое слово, а именно defined
, а также список предопределенных макросов (раздел 16.8). Раздел 16.8 утверждает, что поведение не определено, если вы переопределите их, но не запрещает препроцессору распознавать их как имена макросов.