Xcode 中 DEBUG 标识符上的编译错误

Compilation error on the DEBUG identifier in Xcode

本文关键字:编译 错误 标识符 DEBUG Xcode      更新时间:2023-10-16

我正在尝试使用 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;
}

许多构建环境在调试模式下编译代码时定义预处理器宏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 (即什么都没有或-UDEBUG,或者在编译器命令行上-DDEBUG=DEBUG(。当预处理器宏扩展到自身时,这会将标识符原封不动地传递到编译器的下一阶段(因此DEBUG将正常充当标识符(,但在条件编译指令中阻塞#ifdef DEBUG... #endif将被编译。