首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >C++预处理器#定义关键字。它是否符合标准?

C++预处理器#定义关键字。它是否符合标准?
EN

Stack Overflow用户
提问于 2010-04-28 09:04:58
回答 2查看 5.4K关注 0票数 20

帮助解决this question about bool and 1评论中正在进行的争论

符合标准的C++预处理器是否允许使用#define重新定义语言关键字?如果是这样的话,符合标准的C++预处理器必须允许这样做吗?

如果C++程序重新定义了一种语言关键字,那么该程序本身是否符合标准?

EN

回答 2

Stack Overflow用户

发布于 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节指出,如果您重新定义这些宏名称,则行为未定义,但不禁止预处理器将其识别为宏名称。

票数 5
EN

Stack Overflow用户

发布于 2018-09-06 20:06:24

根据C++11 macro.names的说法,这是不允许的

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

“表3中列出的标识符”是finaloverride;属性标记是[[fallthrough]]中的标识符,依此类推。

这个条款也仍然是最新的标准。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2726204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档