"#if Foo - 0 == 0"和"#if defined(Foo)&& Foo == 0"有什么区别?

Hat*_*ate 12 c c++ qt c-preprocessor

qt文档中找到这个.有什么区别

#if defined(Foo) && Foo ==  0
Run Code Online (Sandbox Code Playgroud)

#if Foo - 0 ==  0
Run Code Online (Sandbox Code Playgroud)

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

AnT*_*AnT 20

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

#if 0 - 0 == 0
Run Code Online (Sandbox Code Playgroud)

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

(顺便说一句,这意味着在C true中将被悄悄地替换为0if <stdbool.h>不包括在内,并且包含1if <stdbool.h>.)

与此同时

#if defined(Foo) && Foo == 0
Run Code Online (Sandbox Code Playgroud)

Foo未定义时为false .所以,这是你的不同之处.

Qt文档确实似乎表明前者与后者相同.我不知道为什么他们这样做,因为他们肯定不相同.它似乎是Qt文档中的错误.

  • "所有未定义的标识符的+1"将替换为"文字0" (5认同)