检测C++源中枚举和#define同名的定义

Detect definitions of same name of enum and #define in C++ source

本文关键字:定义 #define C++ 枚举 检测      更新时间:2023-10-16

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

例如,

#define ABC 100
typedef enum
{
  ABC = 1,
  DEF
} MY_ENUM;

CCD_ 4在两个地方被定义。

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

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

提高编译器的警告级别并没有给我们带来任何错误。当存在这样的重新定义时,我们仍然可以构建没有错误的源。警告的数量大幅增加,而且警告太多,无法逐一查看。

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

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

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

你可以通过以下答案来获得更好的想法枚举与强类型枚举

注意:enum class是C++11的一个功能,不在Visual Studio 2010支持的功能之列。

即使是VS也不会编译您所显示的代码。但是,如果#defineenum定义之后,它可以做你所描述的。如果是这样的话,所有的编译器都会按照你描述的去做。那么,该代码决不是无效的(甚至是值得警告的)。

正如@TheApache所建议的,C++11解决方案应该使用enum class而不是普通的enum,但这需要您浏览所有用例并添加限定。更不用说Visual Studio 2010不支持它

在项目中使用相同名称的宏和枚举器是一个总体的坏主意因此您应该通过删除此条件来解决您的问题。理想情况下,您只需删除宏定义并仅使用枚举器。