在qt文档中可以找到这个内容。 和
据我所知,如果Foo未定义,后者也将是false。我在哪里可以阅读相关信息?
有什么区别?
#if defined(Foo) && Foo == 0
并且
#if Foo - 0 == 0
据我所知,如果Foo未定义,后者也将是false。我在哪里可以阅读相关信息?
有什么区别?
#if defined(Foo) && Foo == 0
并且
#if Foo - 0 == 0
Foo
未定义,则后者将转换为#if 0 - 0 == 0
这是真的,而不是假的。请记住,在#if
下,所有未定义的标识符都将替换为文字0
(在求值所有defined()
运算符之后,当然)。即使是匹配语言关键字的预处理标记也是如此。在C语言中,所有关键字在此上下文中都被替换为0
。在C ++中,关键字true
和false
是例外,而所有其他关键字都将被替换。
顺便说一句,在C中,如果未包括<stdbool.h>
,则true
将被静默地替换为0
,如果已包括,则将被替换为1
。
同时
#if defined(Foo) && Foo == 0
当Foo
未定义时,结果为假。因此,这就是它们之间的区别。
Qt文档确实似乎暗示前者与后者相同。我不知道他们为什么这样做,因为它们肯定不等价。这似乎是Qt文档中的一个错误。
Foo == 0 和 Foo - 0 == 0 的区别在于,在前者中,Foo 必须定义一个值:
#define Foo 0
并且不能是:
#define Foo // Foo == 0 would give an error, cannot evaluate Foo
在Foo - 0 == 0的情况下,Foo可以被定义为没有值
因此:
#if defined(Foo) && Foo == 0
Means Foo已被定义并且它有一个值(在这种情况下为0)。
以及:
#if Foo - 0 == 0
意味着Foo要么被定义为0,要么没有被定义任何值,但由于它不像第一种情况中那样有defined(Foo)的定义,因此未定义的Foo也适用。
defined
一元运算符引起的所有替换完成后,除了true
和false
之外的所有剩余标识符和关键字都将被替换为pp-number0
,然后每个预处理记号都会转换为一个标记。”第16.1p4节。 - Ben Voigt