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

时间:2017-12-13 15:27:30

标签: c++ visual-studio

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

#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混淆,因为我猜他们的范围完全不同。

1 个答案:

答案 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?