【问题标题】:Token "=" is not valid in preprocessor expressions [closed]令牌“=”在预处理器表达式中无效[关闭]
【发布时间】:2012-09-24 23:30:22
【问题描述】:

我有一个程序:

#include <iostream>

#define _DEBUG = 1

using namespace std;
int main() {
        #if (_DEBUG == 1)
                cout << "hello : " <<endl;
        #endif

        return 0;
}

编译会报错:

$ g++ a.cpp
a.cpp:7:7: error: token "=" is not valid in preprocessor expressions
$ g++ --version
g++ (MacPorts gcc46 4.6.3_8) 4.6.3

我认为== 是相等条件运算符?

【问题讨论】:

  • 不要使用以下划线和另一个下划线或大写字母开头的名称;它们被保留用于按照他们的意愿执行。这意味着您对_DEBUG 的使用可能会与系统标头中的某些内容发生冲突,这将是您的代码有问题。实际上,通常最好不要创建以下划线开头的名称。
  • @JonathanLeffler - 有点意思:保留标识符是以下划线开头的名称,后跟一个大写字母,以及包含两个连续下划线的名称。因此,例如,A__B__AB 是保留的。
  • @PeteBecker:你说得对,包含双下划线的名称在 C++ 中也是保留的。我倾向于将其视为与“不要以下划线开头的标识符”分开的规则,尤其是因为 C 没有双下划线限制。

标签: c++ g++ c-preprocessor


【解决方案1】:

我认为只是一个错字:

#define _DEBUG = 1

应该是

#define _DEBUG 1

我一直都这样做!

【讨论】:

  • 对于 cleaning up typo questions 的任何人来说,在我看来,这个实例是一个足够常见的错误,并且在产生的错误消息中保持一致。
【解决方案2】:
#define _DEBUG = 1

这将_DEBUG 声明为扩展为= 1 的宏,因此当它在条件表达式中扩展时,您会得到

#if (= 1 == 1)

这显然不是一个有效的条件表达式。您需要从宏定义中删除=

#define _DEBUG 1

此外,对于像这样的“标记”宏,通常最好测试宏是否被定义,而不是宏的值是什么。例如,

#ifdef _DEBUG

【讨论】:

    【解决方案3】:

    应该是

    #define textToBeReplaced ReplacementText
    

    编译器将遍历您的所有代码并将 textToBeReplaced 的所有实例替换为 replacementText。

    在你的情况下

    #define _debug 1
    


    另外说明你的

        #if(_debug==1)
    

    应该可以

        #ifdef _debug
    

    请注意 1 在这里从来没有发挥作用?这意味着您实际上可以这样做

        #define _debug
    

    不要设置任何东西

    【讨论】:

    • '应该'有点强; “可能”是正确的。他们可能使用了#define _DEBUG 2,在这种情况下,_DEBUG == 1 的测试可能是正确的。
    • 好点,这肯定对多级调试有用,什么不是
    猜你喜欢
    • 2013-07-03
    • 1970-01-01
    • 1970-01-01
    • 2013-11-12
    • 1970-01-01
    • 1970-01-01
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多