Xcode中DEBUG标识符的编译错误

时间:2014-12-15 17:34:28

标签: c++ xcode

我正在尝试使用Xcode构建静态C ++库。我在下面的枚举中的DEBUG标识符上出现构建错误,不确定为什么会发生这种情况。我可以通过终端使用Clang ++来编译它。为什么Xcode中的编译失败?

错误:

Parse Issue
temp_1.h:9:5: Expected identifier

temp_1.h

enum LogLevel {

    DONT_PRINT = 0,
    SPEW       = 1,
    DEBUG     = 2,
    INFO       = 3,
    WARNING    = 4,
    ERROR      = 5,
    FATAL      = 6,
    INVALID                     = 7,
    NO_EXIT_ON_ERROR            = 8,
    MANDATORY                   = 9
};

class temp_1 {    
 public:
    temp_1();
    int get_var();
    void set_var(int _var);

 private:
    int var;    
};

temp_1.cpp:

#include "temp_1.h"

temp_1::temp_1() {        
    var = DEBUG;
}    
int temp_1::get_var() {
    return var;
}    
void temp_1::set_var(int _var) {    
    var = _var;
}

1 个答案:

答案 0 :(得分:1)

许多构建环境在调试模式下编译代码时定义预处理器宏DEBUG,以便您可以编写

#ifdef DEBUG
// do something in debugging mode only
#endif

在您的Xcode版本中,DEBUG被定义为不是标识符的内容,可能是DEBUG=1DEBUG=。因此,预处理后的代码看起来像SPEW = 1, 1 = 2,SPEW = 1, = 2,

避免在代码中使用标识符DEBUG。在C中,您通常会在这些标识符之前添加前缀:LOG_LEVEL_DONT_PRINTLOG_LEVEL_SPEWLOG_LEVEL_DEBUG等。在C ++中,名称空间主要使这些前缀不必要且不具有前提条件。尽管如此,请避免使用全大写DEBUG。您可以不同地命名此标识符,或使用SpewDebug等,并为预处理器保留所有大写字母。

如果您无法使用标识符DEBUG,则可以通过确保构建环境从未将其定义为处理器宏来允许程序构建。如果你想吃蛋糕并吃掉它,你可以做得更好:确保 DEBUG未定义或定义为DEBUG (即没有或{{1编译器命令行上的{},或-UDEBUG。当预处理器宏扩展到自身时,这会将标识符不变地传递给编译器的下一个阶段(因此-DDEBUG=DEBUG将正常作为标识符),但在条件编译指令DEBUG中阻塞... {{ 1}}将被编译。