【问题标题】:What is the reason for a define clashing with a typedef enum in visual studio? [duplicate]定义与 Visual Studio 中的 typedef 枚举冲突的原因是什么? [复制]
【发布时间】:2023-03-29 11:40:02
【问题描述】:

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

#define ERROR 0

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

在 Visual Studio 中编译时出现错误:syntax error: 'constant'。很明显,问题在于我将 ERROR 一词重新用于定义和 typedef 枚举。

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

【问题讨论】:

  • 这是一个宏。这意味着编译器看到ERROR 的每个地方都会用0 替换它。而且,不,它不会“用 g++ 编译”。其他东西可能会编译,但这段代码不会。
  • 主要原因是您在 C++ 中采用了 Java/Python 约定,即常量大写,但它没有意义。
  • −1 用于发布不是真实代码的代码。
  • 你是对的@Pete Becker,它不能在 g++ 中编译,我刚刚意识到定义实际上来自一个 Windows 默认包含wingdi.h,它在使用 g++ 编译时不存在。我猜这个预处理器甚至可能会替换变量名。谢谢。
  • namesspace O RLY?发布您正在使用的实际代码,可能不是那样,否则您会遇到不同的问题。

标签: c++ visual-studio


【解决方案1】:

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

【讨论】:

  • @FrançoisAndrieux 可能值得一提的是,宏在一般用法中被认为是邪恶的,为它们的滥用保留了许多地狱级别;但要赞成能够理解命名空间是一个错字。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-10-16
  • 2011-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-26
  • 2015-01-27
  • 1970-01-01
相关资源
最近更新 更多