“#if Foo - 0 == 0”和“#if defined(Foo)&& Foo == 0”之间有什么区别?

时间:2013-01-04 23:01:11

标签: c++ c qt c-preprocessor

qt documentation中找到此信息。 有什么区别

#if defined(Foo) && Foo ==  0

#if Foo - 0 ==  0

据我所知,如果Foo未定义,后者也将是假的?我在哪里可以读到这个?

2 个答案:

答案 0 :(得分:20)

如果Foo未定义,则后者将转换为

#if 0 - 0 == 0

true ,而不是false。请记住,在#if下,所有未定义的标识符都替换为文字0(当然,所有defined()运算符都被评估)。这甚至适用于匹配语言关键字的预处理令牌。在C语言中,在此上下文中,所有关键字都替换为0。在C ++中,关键字truefalse免于替换,而所有其他关键字都会被替换。

(顺便说一句,这意味着,如果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也适用。