在qt 文档中找到它。和有什么区别
#if defined(Foo) && Foo == 0
和
#if Foo - 0 == 0
据我了解,如果 Foo 未定义,后者也将是错误的?我在哪里可以读到这个?
在qt 文档中找到它。和有什么区别
#if defined(Foo) && Foo == 0
和
#if Foo - 0 == 0
据我了解,如果 Foo 未定义,后者也将是错误的?我在哪里可以读到这个?
如果Foo
未定义,则后者将转换为
#if 0 - 0 == 0
这是真的,不是假的。请记住,在#if
所有未定义的标识符下都将替换为文字0
(当然,一旦defined()
评估了所有运算符)。这甚至适用于匹配语言关键字的预处理标记。0
在 C 语言中,所有关键字都在此上下文中替换为。在 C++ 中的关键字true
和false
免于替换,而所有其他关键字都被替换。
(顺便说一句,这意味着在 Ctrue
中将悄悄地替换为0
if<stdbool.h>
不包括在内,而1
if<stdbool.h>
包括在内。)
同时
#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
表示 Foo 已定义并且它有一个值(在这种情况下为 0)。
和:
#if Foo - 0 == 0
意味着 Foo 要么用 0 定义,要么用不带值定义,但由于它没有第一种情况下的 defined(Foo) ,因此 Foo undefined 也将适用。