在visual studio中定义与typedef枚举冲突的原因是什么?

Jor*_*ell 0 c++ visual-studio

我有一些代码,这里有一些看起来像这个的代码(我当然简化了)

#define ERROR 0

namespace lib{
    class Logger{
         public:
             typedef enum {ERROR = 1} LogLevel;
    };
}
Run Code Online (Sandbox Code Playgroud)

在visual studio中编译我得到错误:syntax error: 'constant'.很明显,问题是我重新使用了ERROR这个词作为define和typedef枚举.

有没有人知道定义的逻辑影响一些变量名称,它实际上包含在命名空间和类中.我的意思是,怎么可能ERROR混淆,lib::Logger::ERROR因为我的猜测是他们有完全不同的范围.

Fra*_*eux 6

#define编译器替换是编译代码时首先要做的事情之一.这些替换是以文本方式进行的,并忽略了c ++语法.您的代码相当于:

namespace lib{
    class Logger{
         public:
             typedef enum {0 = 1} LogLevel;
    };
}
Run Code Online (Sandbox Code Playgroud)

显而易见的是,在ERROR0你的enum定义代替之后是不正确的.

如果任何其他机制可以做同样的工作,使用预处理器marcos通常被认为是一个坏主意.这个问题说明了使用它们的许多风险之一.请参阅问题为什么预处理器宏是邪恶的,有哪些替代方案?.