C++ 代币=&引用;在预处理器表达式中无效
我有一个计划:C++ 代币=&引用;在预处理器表达式中无效,c++,g++,c-preprocessor,C++,G++,C Preprocessor,我有一个计划: #include <iostream> #define _DEBUG = 1 using namespace std; int main() { #if (_DEBUG == 1) cout << "hello : " <<endl; #endif return 0; } 我认为==是等式条件运算符?只是一个输入错误,我认为: #define _DEBUG
#include <iostream>
#define _DEBUG = 1
using namespace std;
int main() {
#if (_DEBUG == 1)
cout << "hello : " <<endl;
#endif
return 0;
}
我认为==
是等式条件运算符?只是一个输入错误,我认为:
#define _DEBUG = 1
应该是
#define _DEBUG 1
#define textToBeReplaced ReplacementText
我一直都这么做
#define _DEBUG = 1
这将\u DEBUG
声明为一个宏,该宏扩展为=1
,因此当它在条件表达式中展开时,您将得到
#if (= 1 == 1)
这显然不是一个有效的条件表达式。您需要从宏定义中删除=
:
#define _DEBUG 1
此外,对于这样的“标志”宏,通常最好测试宏是否已定义,而不是宏的值是什么。比如说,
#ifdef _DEBUG
应该是
#define _DEBUG 1
#define textToBeReplaced ReplacementText
编译器将检查您的所有代码,并用replacementText替换TextToBeReplace的所有实例
在你的情况下是这样的
#define _debug 1
另一方面
#if(_debug==1)
应该是
#ifdef _debug
注意到1在这里从来没有起作用吗?这意味着你实际上可以这样做
#define _debug
不要将其设置为任何值不要使用以下划线和另一个下划线或大写字母开头的名称;它们是为实现而保留的,可以按照它们的意愿进行处理。这意味着您对
\u DEBUG
的使用可能会与系统标题中的某些内容发生冲突,而出错的可能是您的代码。实际上,通常最好不要创建以下划线开头的名称。@JonathanLeffler-有点怪:保留标识符是以下划线开头,后跟大写字母的名称,以及包含两个连续下划线的名称。因此,例如,<代码> Ayb b < /COD>是保留的,以及<代码> PeteBecker,代码> > @:您是正确的,包含双下划线的名称也保留在C++中。我倾向于将其视为与“不要以下划线开始标识符”不同的一条规则,尤其是因为C没有双下划线限制。“应该”有点强;'“可能”是正确的。它们可能有#define(定义)DEBUG 2
,在这种情况下,(定义)DEBUG==1
的测试可能是正确的。好的一点是,这对多个级别的调试非常有用,而且对任何人都没有好处,在我看来,这个实例是一个非常常见的错误,并且在生成的错误消息中保持一致,以保证保留。