为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
人到中年有点甜 2019-11-04 09:27:03
帮助解决有关bool和1的问题的评论中正在进行的辩论:符合标准的C ++预处理程序可以允许使用它#define来重新定义语言关键字吗?如果是这样,那么符合标准的C ++预处理器必须允许吗?如果C ++程序重新定义了语言关键字,那么该程序本身是否符合标准?
查看完整描述

3 回答

?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

在C ++中,最接近禁止#define关键字的是§17.4.3.1.1/ 2,它仅在包含标准库头的翻译单元中禁止使用它:


包含头的翻译单元不得包含任何定义该头中声明或定义的名称的宏。这样的翻译单元也不应为词法上与关键字相同的名称定义宏。


该段的第二句在C ++ 0x中已更改为完全禁止#define关键字(C ++ 0x FCD§17.6.3.3.1):


翻译单元不得在词义上与关键字相同的#define或#undef名称。



查看完整回答
反对 回复 2019-11-04
?
子衿沉夜

TA贡献1828条经验 获得超3个赞

从2005-10-19 C ++工作草案开始工作(因为我没有方便使用的标准):


第16.3节定义了文法#define是#define identifier replacement-list-newline(类似对象的宏)或开头几种结构中的一个#define identifier lparen(函数宏)。identifier在2.10节中将定义为identifier-nondigit | identifier identifier-nondigit | identifier digit。2.11节指出,标识符的某些列表在编译的第7阶段(第2.1节)被无条件地视为关键字,因此,我得出结论,因此在第4阶段(预处理器扩展)中并未对它们进行特殊处理。因此,似乎该标准要求预处理器允许您重新定义语言关键字(在2.11节中列出)。


但是,预处理器具有自己的关键字,即defined,以及预定义的宏列表(第16.8节)。第16.8节指出,如果您重新定义它们,则行为是不确定的,但并不禁止预处理器将它们识别为宏名。


查看完整回答
反对 回复 2019-11-04
?
料青山看我应如是

TA贡献1772条经验 获得超7个赞

根据C ++ 11 [macro.names],这是不允许的:


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


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


该条款也仍然是最新标准。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 397 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信