检测C++源中枚举和#define同名的定义
Detect definitions of same name of enum and #define in C++ source
我们有一个C++源,其中包含大量使用#define
和enum
进行的定义。最近,在分析一个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也不会编译您所显示的代码。但是,如果#define
在enum
定义之后,它可以做你所描述的。如果是这样的话,所有的编译器都会按照你描述的去做。那么,该代码决不是无效的(甚至是值得警告的)。
正如@TheApache所建议的,C++11解决方案应该使用enum class
而不是普通的enum
,但这需要您浏览所有用例并添加限定。更不用说Visual Studio 2010不支持它
在项目中使用相同名称的宏和枚举器是一个总体的坏主意,因此您应该通过删除此条件来解决您的问题。理想情况下,您只需删除宏定义并仅使用枚举器。
- 找不到 #define 的函数定义
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- #define DATA 10 和 # (如果定义了 DATA)之间的差异
- 已经在 .obj 中定义,即使有 #ifndef #define #endif
- 如何比较 #define 定义的字符串和整数
- 如何将定义(#define some_define)作为函数的参数传递
- 如何使用'#define';定义一个宏来执行多个方法
- 是否可以为 #define 分配定义的结果?
- 当定义与运算符有价值时,#define 如何在编程中工作
- 在运行时重新定义 c++ 中的 #define
- #Define USE_SQLDB(定义(USE_SQLITE)||定义(USE_MYSQL))
- 使用来自其他方法和 #define 的函数定义常量
- #define变量在windows.h中被忽略并重新定义
- 在cpp中用#define定义函数
- 重新定义(#define)保留的c++关键字
- 使用 #define 来定义静态数组的大小是否合法?
- g++链接错误:使用#define编写函数名称时,未定义对函数的引用
- 定义类型的正确方式(typedef与#define)
- 在 #define 中定义的最大值无法正常工作
- 使用 #undefine 而不首先定义 (#define) 宏的效果