是#define/#undef具有特殊含义的标识符是不确定的行为?

Sha*_*our 13 c++ undefined-behavior language-lawyer c++11

在gcc中禁用检查覆盖的问题的答案建议-Doverride=在命令行上使用以禁用错误使用覆盖的错误,这实际上与添加:

#define override
Run Code Online (Sandbox Code Playgroud)

到源文件.

我最初的反应是,这似乎是未定义的行为,因为我们正在重新定义关键字但是查看草案C++ 11标准部分2.12 关键字[lex.key]我很惊讶,无论是覆盖还是最终都不是关键字.它们在上一节2.11 [lex.name]中有所介绍,它说它们是具有特殊含义的标识符:

表3中的标识符在特定情况下出现时具有特殊含义[...]

表3中被标记为具有特殊的含义标识符,并且包括覆盖最后.

问题是,重新定义(使用#define)具有特殊含义的标识符是不确定的行为?在这方面,他们的待遇是否与关键词不同?

Sha*_*our 12

如果您使用的是C++标准库,则重新定义具有特殊含义的标识符是未定义的行为,这也适用于关键字.从17.6.4 [约束]部分的C++ 11标准草案中,我们有17.6.4.1 [constraints.overview]部分,其中说:

本节描述了对使用C++标准库的工具的C++程序的限制[...]

17.6.4我们的章节17.6.4.3.1 [macro.names]下面写着:

翻译单元不得#define或#undef名称与关键字词汇相同,与表3中列出的标识符或7.6中描述的属性标记相同.

表3列出了具有特殊含义标识符.我们可以看到这一段也涵盖了关键字,它们也以相同的方式处理.

  • @DieterLücking请看[我可以回答我自己的问题,即使我在问之前知道答案吗?](http://meta.stackexchange.com/q/17463/213111) (2认同)