为了评估#if条件,我的预处理器似乎假定未定义的常量为0 。可以依靠它吗,或者未定义的常量会产生未定义的行为?
3 回答
暮色呼如
TA贡献1853条经验 获得超9个赞
是的,可以依靠它。C99标准在§6.10.1¶3中进行了规定:
由于宏扩展和已定义的一元运算符而执行所有替换后,所有剩余的标识符都将替换为pp-number 0
编辑
抱歉,我认为这是一个C问题。没什么大不了的,C ++标准(第16.1节¶4)中的等效部分指出:
由于宏扩展和已定义的一元运算符而执行了所有替换后,除true和之外的所有其余标识符和关键字false将替换为pp-number0
唯一的区别是不同处理的true和false,其中用C不需特殊处理,而在C ++中,他们有一个特殊的意义,即使在预处理阶段。
HUWWW
TA贡献1874条经验 获得超12个赞
0
在对表达式求值之前,会将未定义为宏的标识符转换为。
标识符true
是例外,它将转换为1
。这是特定于C ++预处理程序的;在C语言中,这不会发生,您需要包括<stdbool.h>
使用true
这种方式,在这种情况下,它将被定义为宏,并且不需要任何特殊处理。
ABOUTYOU
TA贡献1812条经验 获得超5个赞
只是好奇:编译器为什么要这么做?为什么在表达式未定义并且编译器仍然知道这一点时,编译器为什么不能抛出错误消息?这不会导致软件中不必要的错误吗?我真的很困惑,为什么较新的编译器不注意这一点。仅仅是因为必须保持向后兼容性吗?
- 3 回答
- 0 关注
- 766 浏览
添加回答
举报
0/150
提交
取消