Препроцессор C++ #define-ing ключевое слово. Это - приспосабливание стандартов?

Справка улаживает дебаты, на которые это идет в комментариях в этом вопросе о bool и 1:

Может приспосабливающий стандартам препроцессор C++ позволять использовать #define переопределять ключевое слово языка? Если так, приспосабливающий стандартам препроцессор C++ должен позволить это?

Если программа C++ переопределяет ключевое слово языка, которое может программировать себя, приспосабливание стандартов?

20
задан Community 23 May 2017 в 12:08
поделиться

2 ответа

В 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; текст был изменен, чтобы сбить с толку таких, как я. : -)

23
ответ дан 30 November 2019 в 00:39
поделиться

Работа с 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 указано, что поведение не определено, если вы их переопределите, но не запрещает препроцессору распознавать их как имена макросов.

5
ответ дан 30 November 2019 в 00:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: