c++ - 在 visual studio 中定义与 typedef 枚举发生冲突的原因是什么?

标签 c++ visual-studio

<分区>

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

#define ERROR 0

namespace lib{
    class Logger{
         public:
             typedef enum {ERROR = 1} LogLevel;
    };
}

在 visual studio 中编译时出现错误:syntax error: 'constant'。很明显,问题是我为定义和 typedef 枚举重新使用了 ERROR 一词。

有谁知道影响某些变量名的定义逻辑,这些变量名实际上包含在命名空间和类中。我的意思是,ERROR 怎么会与 lib::Logger::ERROR 混淆,因为我猜测它们具有完全不同的范围。

最佳答案

预处理器 #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? .

关于c++ - 在 visual studio 中定义与 typedef 枚举发生冲突的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47796709/

相关文章:

c++ - 代码块不会在断点处停止

c++ - '<' 标记错误之前的预期主表达式

visual-studio - Visual Studio中上一个和下一个调用堆栈帧的热键

asp.net - 我可以自由地移动/选择 Nuget 包安装的脚本的自定义文件位置并仍然对其进行更新吗?

visual-studio - 从各个页面捕获自定义事件

c++ - 在哪个头文件中声明了 c++ STL 哈希函数对象?

c++ - MFC 消息映射中的函数地址

c++ - 自动库选择

c++ - 创建静态 CUDA 库以与 C++ 程序链接

c++ - 为什么在将 std::vector 与默认构造函数一起使用时会出现异常行为?