#if中使用的未定义常量的值是什么?

为了评估#if条件,我的预处理器似乎假定未定义的常量为0 。

可以依靠它吗,或者未定义的常量会产生未定义的行为?


跃然一笑
浏览 771回答 3
3回答

暮色呼如

是的,可以依靠它。C99标准在§6.10.1¶3中进行了规定:由于宏扩展和已定义的一元运算符而执行所有替换后,所有剩余的标识符都将替换为pp-number 0编辑抱歉,我认为这是一个C问题。没什么大不了的,C ++标准(第16.1节¶4)中的等效部分指出:由于宏扩展和已定义的一元运算符而执行了所有替换后,除true和之外的所有其余标识符和关键字false将替换为pp-number0唯一的区别是不同处理的true和false,其中用C不需特殊处理,而在C ++中,他们有一个特殊的意义,即使在预处理阶段。

HUWWW

0在对表达式求值之前,会将未定义为宏的标识符转换为。标识符true是例外,它将转换为1。这是特定于C ++预处理程序的;在C语言中,这不会发生,您需要包括<stdbool.h>使用true这种方式,在这种情况下,它将被定义为宏,并且不需要任何特殊处理。

ABOUTYOU

只是好奇:编译器为什么要这么做?为什么在表达式未定义并且编译器仍然知道这一点时,编译器为什么不能抛出错误消息?这不会导致软件中不必要的错误吗?我真的很困惑,为什么较新的编译器不注意这一点。仅仅是因为必须保持向后兼容性吗?
打开App,查看更多内容
随时随地看视频慕课网APP