If-指令宏比较

问题描述 投票:1回答:2

为什么在以下代码中满足#if条件:

#include <iostream>
#define VALUE foo    

int main() {    
#if VALUE == bar
    std::cout << "WORKS!" << std::endl;
#endif // VALUE
}
c++ c-preprocessor
2个回答
3
投票

page on cppreference.com状态:

所有宏扩展后,对defined和__has_include进行评估(自C ++ 17起)表达式,不是布尔值的任何标识符文字被替换为数字``0''(包括标识符是词汇上的关键字,但不是替代标记,如and)。

因此foobar都被替换为0。


3
投票

#if语句中,宏替换后剩余的所有标识符(truefalse除外)都将被常量0替换。所以你的指令变成

#if 0 == 0

是的。


1
投票

这是因为foobar都没有给出任何定义或值-因此它们是相同的。编译器将对此发出警告。

MSVC编译器(Visual Studio 2019)提供以下内容:

警告C4668:'foo'未定义为预处理器宏,替换为带有“ 0”的警告C4668:“ bar”未定义为预处理器宏,用“ 0”代替“#if /#elif”

因此VALUE的值为'0'(foo的默认值),bar的值为'0',因此VALUE == bar的值为“ TRUE”。

© www.soinside.com 2019 - 2024. All rights reserved.