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

帮助解决有关bool和1的问题的评论中正在进行的辩论:


符合标准的C ++预处理程序可以允许使用它#define来重新定义语言关键字吗?如果是这样,那么符合标准的C ++预处理器必须允许吗?


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


人到中年有点甜
浏览 416回答 3
3回答

小怪兽爱吃肉

在C ++中,最接近禁止#define关键字的是§17.4.3.1.1/ 2,它仅在包含标准库头的翻译单元中禁止使用它:包含头的翻译单元不得包含任何定义该头中声明或定义的名称的宏。这样的翻译单元也不应为词法上与关键字相同的名称定义宏。该段的第二句在C ++ 0x中已更改为完全禁止#define关键字(C ++ 0x FCD§17.6.3.3.1):翻译单元不得在词义上与关键字相同的#define或#undef名称。

子衿沉夜

从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节指出,如果您重新定义它们,则行为是不确定的,但并不禁止预处理器将它们识别为宏名。

料青山看我应如是

根据C ++ 11 [macro.names],这是不允许的:翻译单元#define或#undef关键词,表3中列出的标识符或7.6中描述的属性标记的名称或词法上不应相同。“表3中列出的标识符”是final和override;属性标记是中的标识符[[fallthrough]],依此类推。该条款也仍然是最新标准。
打开App,查看更多内容
随时随地看视频慕课网APP