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

C++ visual studio中定义与typedef枚举冲突的原因是什么?,c++,visual-studio,C++,Visual Studio,我有一些代码,其中一些代码看起来像这个,我简化了它,当然 #define ERROR 0 namespace lib{ class Logger{ public: typedef enum {ERROR = 1} LogLevel; }; } 在VisualStudio中编译时,我得到一个错误:语法错误:“常量”。很明显,问题在于我正在对define和typedef枚举重新使用单词ERROR 是否有人知道定义的逻辑影响某个变量名,该

我有一些代码,其中一些代码看起来像这个,我简化了它,当然

#define ERROR 0

namespace lib{
    class Logger{
         public:
             typedef enum {ERROR = 1} LogLevel;
    };
}
在VisualStudio中编译时,我得到一个错误:语法错误:“常量”。很明显,问题在于我正在对define和typedef枚举重新使用单词ERROR

是否有人知道定义的逻辑影响某个变量名,该变量名实际上包含在名称空间和类中。我的意思是,既然我猜它们有完全不同的作用域,怎么能将ERROR与lib::Logger::ERROR混淆呢

预处理器定义替换是编译代码时首先发生的事情之一。这些替换是文本化的,而忽略C++语法。您的代码相当于:

namespace lib{
    class Logger{
         public:
             typedef enum {0 = 1} LogLevel;
    };
}
很明显,在用0替换错误之后,您的枚举定义的格式是错误的


如果任何其他机制都可以做同样的工作,那么使用预处理器marcos通常被视为一个坏主意。这个问题说明了与使用它们相关的许多风险之一。查看问题。

这是一个宏。这意味着编译器看到错误的每个地方都会将其替换为0。而且,不,它不是用g++编译的。其他的东西可能会编译,但是这个代码不会。主要原因是你采用了java/python约定,即C++中的常量大写,在那里它没有任何意义。−1发布不是真实代码的代码。你说得对@Pete Becker,它不是用g++编译的,我刚刚意识到定义实际上来自windows默认的include wingdi.h,在用g++编译时不存在。我想,这可能是因为预处理器甚至可能会替换变量名。谢谢,你呢?发布您正在使用的实际代码,这可能不是问题所在,否则您会遇到另一个问题。@FrançoisAndrieux可能值得一提的是,宏在一般使用中被认为是邪恶的,有许多级别的地狱为它们的误用保留;但是要有一个能够理解名称空间是一个输入错误的投票权。