重新定义C++关键字是否合法?

qdi*_*dii 12 c++ standards keyword c-preprocessor

在本周大师的这篇文章中,有人说:It is illegal to #define a reserved word.这是真的吗?我找不到常规,我已经看过程序员重新定义新的,例如.

Alo*_*ave 19

17.4.3.1.1宏名[lib.macro.names]

1如果转换单元包含标题,则每个在标题中定义为宏的名称将保留给实现用于任何用途.16)
包含标题的转换单元不应包含定义在该标题中声明或定义的名称的任何宏.这样的翻译单元也不应该为与关键字词汇相同的名称定义宏.

顺便说一下,new是一个操作员,它可以由用户通过提供自己的版本来重载(替换).

  • 请注意,该规则仅适用于包含标准标头的源.如果翻译单元不包含标准标题,则重新定义关键字是完全合法的.(但是,它对代码的可读性没有太大作用.) (7认同)
  • @victor - 该语言允许编译器*知道*每个标准头文件中的内容,因此不必每次都重新编译它们。因此,禁止通过重新定义这些标题中的某些词来更改它们。您对自己的标题做什么取决于您! (2认同)

Jos*_*eld 11

C++ 11中的相应部分:

17.6.4.3.1宏名[macro.names]

1包含标准库头的转换单元不得在任何标准库头中声明#define或#undef名称.
2翻译单元不得#define或#undef名称与关键字词汇相同.

C++ 03的第1段已被删除.第二段分为两部分.现在,上半部分已经更改为具体说明它仅适用于标准标题.第二点已经扩展到包括任何翻译单元,而不仅仅是包含标题的翻译单元.

但是,标准的此部分概述(17.6.4.1 [constraints.overview])指出:

本节介绍对使用C++标准库功能的C++程序的限制.

因此,如果您没有使用C++标准库,那么您可以按照自己的意愿行事.

因此,要在C++ 11的上下文中回答您的问题:如果您使用的是C++标准库,则无法在任何翻译单元中定义(或取消定义)与关键字相同的任何名称.