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
}