C++两个不同enum包含同名枚举项报错重定义的原因及解决办法
报错原因
C 语言、以及 C++11 之前标准里的普通无作用域枚举,其枚举值的作用域是枚举定义所在的外层作用域,而非隶属于枚举类型本身。你在同一个作用域下的两个枚举中定义同名的TEST枚举值,等价于在同一个作用域内重复定义同名常量,因此编译器会抛出重定义错误。
可行规避方案
- 方案1(适用C++11及更高版本):改用强类型枚举(
enum class)
强类型枚举的枚举值作用域完全隶属于枚举本身,不会泄漏到外层作用域,天然支持不同枚举下的同名枚举值,使用时加上枚举名前缀即可:
enum class test1 { TEST }; enum class test2 { TEST }; // 调用示例 test1 val1 = test1::TEST; test2 val2 = test2::TEST;
- 方案2(兼容C语言、所有C++版本):给枚举值加专属前缀
给不同枚举的枚举值添加对应枚举名相关的前缀,从命名上直接避免冲突:
enum test1 { TEST1_TEST }; enum test2 { TEST2_TEST };
- 方案3(适用所有C++版本):将枚举放到不同命名空间
把两个枚举分别定义在不同的命名空间下,通过命名空间前缀区分同名枚举值:
namespace group1 { enum test1 { TEST }; } namespace group2 { enum test2 { TEST }; } // 调用示例 int val1 = group1::TEST; int val2 = group2::TEST;
内容的提问来源于stack exchange,提问作者jujumumu
相关产品推荐
相关产品推荐

