帮助解决this question about bool and 1评论中正在进行的争论
符合标准的C++预处理器是否允许使用#define
重新定义语言关键字?如果是这样的话,符合标准的C++预处理器必须允许这样做吗?
如果C++程序重新定义了一种语言关键字,那么该程序本身是否符合标准?
发布于 2010-04-28 10:02:57
在2005-10-19 C++ working draft上工作(因为我手头没有标准的):
第16.3节将#define
的语法定义为#define identifier replacement-list-newline
(类似对象的宏)或以#define identifier lparen
(类似函数的宏)开头的几种结构之一。第2.10节中将identifier
定义为identifier-nondigit | identifier identifier-nondigit | identifier digit
。第2.11节指出,在编译阶段7(第2.1节)中,某个标识符列表被无条件地视为关键字,因此我得出结论,它们在阶段4中没有被特殊对待,这是预处理器扩展。因此,该标准似乎要求预处理器允许您重新定义语言关键字(在2.11节中列出)。
但是,预处理器有自己的关键字,即defined
,以及预定义的宏列表(第16.8节)。第16.8节指出,如果您重新定义这些宏名称,则行为未定义,但不禁止预处理器将其识别为宏名称。
发布于 2018-09-06 20:06:24
根据C++11 macro.names的说法,这是不允许的
翻译单元不应在词汇上与关键字、表3中列出的标识符或7.6中描述的属性标记相同的
#define
或#undef
名称。
“表3中列出的标识符”是final
和override
;属性标记是[[fallthrough]]
中的标识符,依此类推。
这个条款也仍然是最新的标准。
https://stackoverflow.com/questions/2726204
复制相似问题