我正在尝试使用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;
}
答案 0 :(得分:1)
许多构建环境在调试模式下编译代码时定义预处理器宏DEBUG
,以便您可以编写
#ifdef DEBUG
// do something in debugging mode only
#endif
在您的Xcode版本中,DEBUG
被定义为不是标识符的内容,可能是DEBUG=1
或DEBUG=
。因此,预处理后的代码看起来像SPEW = 1, 1 = 2,
或SPEW = 1, = 2,
。
避免在代码中使用标识符DEBUG
。在C中,您通常会在这些标识符之前添加前缀:LOG_LEVEL_DONT_PRINT
,LOG_LEVEL_SPEW
,LOG_LEVEL_DEBUG
等。在C ++中,名称空间主要使这些前缀不必要且不具有前提条件。尽管如此,请避免使用全大写DEBUG
。您可以不同地命名此标识符,或使用Spew
,Debug
等,并为预处理器保留所有大写字母。
如果您无法使用标识符DEBUG
,则可以通过确保构建环境从未将其定义为处理器宏来允许程序构建。如果你想吃蛋糕并吃掉它,你可以做得更好:确保 DEBUG
未定义或定义为DEBUG
(即没有或{{1编译器命令行上的{},或-UDEBUG
。当预处理器宏扩展到自身时,这会将标识符不变地传递给编译器的下一个阶段(因此-DDEBUG=DEBUG
将正常作为标识符),但在条件编译指令DEBUG
中阻塞... {{ 1}}将被编译。