我们有一个C ++源代码,其中包含大量使用#define
和enum
定义的内容。最近在分析错误时,我们发现使用#define
预处理器指令进行了一些定义,这些定义也是枚举的成员。分配给它们的值虽然不同。
例如,
#define ABC 100
typedef enum
{
ABC = 1,
DEF
} MY_ENUM;
ABC
在两个地方定义。
令人惊讶的是,Visual Studio没有给我们一个错误。甚至没有警告。
我们担心可能会有其他定义以相同的方式定义并希望找到它们。
提高编译器的警告级别并没有给我们任何错误。当存在这样的重新定义时,我们仍然可以无错误地构建源。警告的数量大幅增加,并且有太多的警告要逐一进行。
有谁知道检测这些多重定义的方法?
我们使用Visual Studio 2010 Professional作为IDE。
答案 0 :(得分:4)
使用enum class
代替enum
。这样,您就可以确保在正确的位置使用正确的东西
您可以通过以下答案获得更好的主意 Enum vs Strongly typed enum
注意:enum class
是C ++ 11的一项功能,不属于Visual Studio 2010支持的功能。
答案 1 :(得分:3)
即使VS也无法编译您显示的代码。但是,如果在#define
定义之后enum
来到,它可以执行您所描述的内容。如果是这样的话,所有编译器都会完全按照您的描述进行操作。这段代码绝不是无效的(甚至是警告值得的)。
作为@TheApache suggests,C ++ 11解决方案将使用enum class
而不是普通enum
,但这需要您查看所有用例并添加资格。更不用说Visual Studio 2010不支持它。
在项目中使用同名的宏和枚举器是一个非常坏主意,所以你应该通过删除这个条件来解决你的情况。理想情况下,您只需删除宏定义并仅使用枚举数。