【问题标题】:Detect definitions of same name of enum and #define in C++ source在 C++ 源代码中检测枚举和#define 同名的定义
【发布时间】:2016-02-11 01:57:35
【问题描述】:

我们有一个 C++ 源代码,其中包含大量使用 #defineenum 进行的定义。最近在分析一个错误时,我们发现有一些定义是使用 #define 预处理器指令进行的,它们也是枚举的成员。但是分配给它们的值是不同的。

例如,

#define ABC 100

typedef enum
{
  ABC = 1,
  DEF
} MY_ENUM;

ABC 在两个地方定义。

令人惊讶的是,Visual Studio 没有给我们一个错误。甚至没有警告。

我们担心可能有其他定义以相同方式定义并希望找出它们。

提高编译器的警告级别并没有给我们任何错误。当存在这样的重新定义时,我们仍然可以毫无错误地构建源代码。警告数量大幅增加,警告太多,无法一一处理。

有人知道检测这些多重定义的方法吗?

我们使用 Visual Studio 2010 Professional 作为 IDE。

【问题讨论】:

  • 这就是为什么你不应该对除宏以外的任何东西使用全大写。
  • 听起来是进行大扫除的好时机。将#define 替换为const int ABC = 100;,Visual Studio 会报错。

标签: c++ visual-studio-2010 enums redefinition


【解决方案1】:

使用enum class 而不是enum。这样,您可以确保在正确的地方使用正确的东西

您可以通过以下答案获得更好的想法 Enum vs Strongly typed enum

注意:enum class 是 C++11 功能,不属于 Visual Studio 2010 支持的功能。

【讨论】:

  • 谢谢。即使如果 VS2010 支持它我不能使用它,我会记住这一点。我不知道枚举类。
  • 如果能解决您的目的,请标记为正确。
【解决方案2】:

即使 VS 也不会编译您显示的代码。但如果#define 出现在enum 定义之后,它可以做你描述的事情。如果是这种情况,所有编译器都会完全按照您的描述进行。那么代码绝不是无效的(甚至是值得警告的)。

作为@TheApache suggests,C++11 解决方案是使用enum class 而不是普通的enum,但这需要您遍历所有用例并添加限定条件。更不用说 Visual Studio 2010 不支持它。

在项目中使用同名的宏和枚举器是一个非常坏主意所以你绝对应该通过删除这个条件来解决你的情况。理想情况下,您只需删除宏定义并仅使用枚举器。

【讨论】:

  • 谢谢,不过如果VS2010不支持,我就不能用了。
  • @nushydude 认为你应该做的(以及答案所说的)就是完全摆脱宏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 1970-01-01
  • 2023-04-10
  • 2011-06-29
  • 1970-01-01
相关资源
最近更新 更多