我有一些代码,这些代码在这里看起来像这个(我当然简化了)
#define ERROR 0
namespace lib{
class Logger{
public:
typedef enum {ERROR = 1} LogLevel;
};
}
在visual studio中编译时,我收到错误:syntax error: 'constant'
。很明显,问题是我重新使用了ERROR这个词作为define和typedef枚举。
有没有人知道定义的逻辑影响某个变量名称,这个变量名称实际上包含在命名空间和类中。我的意思是,ERROR
如何与lib::Logger::ERROR
混淆,因为我猜他们的范围完全不同。
答案 0 :(得分:6)
预编译器#define
替换是编译代码时首先要做的事情之一。这些替换是以文本方式进行的,并忽略了c ++语法。您的代码相当于:
namespace lib{
class Logger{
public:
typedef enum {0 = 1} LogLevel;
};
}
很明显,在ERROR
替换为0
之后,enum
定义的格式不正确。
使用预处理器marcos通常被认为是一个坏主意,如果任何其他机制可以做同样的工作。这个问题说明了使用它们的许多风险之一。请参阅问题Why are preprocessor macros evil and what are the alternatives?。