在qt documentation中找到此信息。 有什么区别
#if defined(Foo) && Foo == 0
和
#if Foo - 0 == 0
据我所知,如果Foo未定义,后者也将是假的?我在哪里可以读到这个?
答案 0 :(得分:20)
如果Foo
未定义,则后者将转换为
#if 0 - 0 == 0
true ,而不是false。请记住,在#if
下,所有未定义的标识符都替换为文字0
(当然,所有defined()
运算符都被评估)。这甚至适用于匹配语言关键字的预处理令牌。在C语言中,在此上下文中,所有关键字都替换为0
。在C ++中,关键字true
和false
免于替换,而所有其他关键字都会被替换。
(顺便说一句,这意味着,如果true
未包含0
,则<stdbool.h>
会被1
悄然取代,如果<stdbool.h>
是#if defined(Foo) && Foo == 0
则会Foo
包括在内。)
同时
{{1}}{{1}}未定义时,
为false。所以,这是你的不同之处。
Qt文档确实似乎表明前者与后者相同。我不知道为什么他们这样做,因为他们肯定不相同。它似乎是Qt文档中的一个错误。
答案 1 :(得分:1)
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
表示定义了Foo,它有一个值(在这种情况下为0)。
和
#if Foo - 0 == 0
意味着Foo要么定义为0,要么定义为没有值,但由于它没有像第一种情况那样定义的(Foo),所以Foo undefined也适用。