Справка улаживает дебаты, на которые это идет в комментариях в этом вопросе о bool и 1:
Может приспосабливающий стандартам препроцессор C++ позволять использовать #define
переопределять ключевое слово языка? Если так, приспосабливающий стандартам препроцессор C++ должен позволить это?
Если программа C++ переопределяет ключевое слово языка, которое может программировать себя, приспосабливание стандартов?
В C ++ ближе всего к запрещению #define
ключевого слова является §17.4.3.1.1 / 2, который запрещает его только в единицах перевода, включает заголовок стандартной библиотеки:
Единица трансляции, которая включает заголовок, не должна содержать никаких макросов, определяющих имена, объявленные или определенные в этом заголовке.Также такая единица перевода не должна определять макросы для имен, лексически идентичных ключевым словам.
Второе предложение этого абзаца было изменено в C ++ 0x, чтобы полностью запретить #define
ключевое слово (C ++ 0x FCD §17.6.3.3.1):
Перевод unit не должен #define или #undef имена, лексически идентичные ключевым словам.
Edit: Как указал Кен Блум в комментариях к его ответу , правила не изменились в C ++ 0x; текст был изменен, чтобы сбить с толку таких, как я. : -)
Работа с 2005-10-19 рабочий черновик C ++ (поскольку у меня нет стандартного подручного средства):
Раздел 16.3 определяет грамматику для #define
как #define identifier replace-list-newline
(объектно-подобные макросы) или одну из нескольких конструкций, начинающихся с #define identifier lparen
(функциональные макросы). идентификаторы
определены в разделе 2.10 как идентификатор-нецифровой | идентификатор идентификатор-нецифровой | цифра идентификатора
. Раздел 2.11 указывает, что определенный список идентификаторов безусловно обрабатывается как ключевые слова на этапе 7 компиляции (раздел 2.1), и я пришел к выводу, что они поэтому не обрабатываются специально на этапе 4, который является расширением препроцессора. Таким образом, похоже, что стандарт требует, чтобы препроцессор позволял вам переопределять ключевые слова языка (перечисленные в Разделе 2.11) .
Однако у препроцессора есть собственное ключевое слово, а именно определено
, а также список предопределенных макросов (раздел 16.8). В разделе 16.8 указано, что поведение не определено, если вы их переопределите, но не запрещает препроцессору распознавать их как имена макросов.