C++ If指令宏比较

C++ If指令宏比较,c++,c-preprocessor,C++,C Preprocessor,为什么满足以下代码中的#if条件: #包括 #定义值foo int main(){ #如果值==巴 std::cout状态: 在所有宏扩展和评估已定义和u__包括 (自C++17)表达式以来,任何不是布尔值的标识符 文字将替换为数字​0​ (这包括标识符。) 这是词汇上的关键字,但不是替代标记(如和) 因此,首先将VALUE替换为foo,然后将foo和bar替换为0。在\if语句中,宏替换后保留的任何标识符(除了true和false)替换为常量0。因此您的指令变为 #if 0 == 0 这是正

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

#包括
#定义值foo
int main(){
#如果值==巴
std::cout状态:

在所有宏扩展和评估已定义和u__包括 (自C++17)表达式以来,任何不是布尔值的标识符 文字将替换为数字​0​ (这包括标识符。) 这是词汇上的关键字,但不是替代标记(如和)

因此,首先将
VALUE
替换为
foo
,然后将
foo
bar
替换为0。

\if
语句中,宏替换后保留的任何标识符(除了
true
false
)替换为常量
0
。因此您的指令变为

#if 0 == 0

这是正确的。

这是因为
foo
bar
都没有给出任何定义或值-因此它们是相同的(即替换为“0”值)。编译器将对此发出警告

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

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

因此
VALUE
被赋予值“0”(默认值为
foo
),而
bar
也有“0”,因此
VALUE==bar
的计算结果为“TRUE”

类似地,
clang cl
给出了以下内容:

警告:未定义“foo”,计算结果为0[-Wundef]
警告 :“bar”未定义,计算结果为0[-Wundef]


要实现您的目标,请尝试以下方法:

#include <iostream>
#define DEBUG  

int main() {    
#ifdef DEBUG
    std::cout << "WORKS!" << std::endl;
#endif
}
#包括
#定义调试
int main(){
#ifdef调试

std::警告是强制性的还是编译器的一项功能?@kelalaka据我所知,没有编译器“警告”是强制性的!即使使用
MSVC
clang cl
编译器,也可以禁用此警告(具体地说,或者通过设置适当的警告“级别”)。那么C++98、C++03、C++11和C++14呢?@kelalaka都是一样的。从C89开始就一直是这样。@Kelalalaka的“自C++17”只指“和有包括”部分。在C++17之前是相同的,只是省略了该部分。为了澄清,“define VALUE foo”定义了符号“VALUE”,以解析为与符号“foo”相同的值,但符号“foo”没有任何意义,因此它将被解释为0。
#include <iostream>
#undef DEBUG  

int main() {    
#ifdef DEBUG
    std::cout << "WORKS!" << std::endl;
#endif
}
#include <iostream>

int main() {    
#ifdef DEBUG
    std::cout << "WORKS!" << std::endl;
#endif
}