我有一种情况,我需要两个枚举来保存一个同名成员。我的代码是C语言,使用IAR Embeddedj Workbench IDE。代码片段如下:
enum Port_e : uint32_t
{
PortA = 0,
PortB,
PortC,
PortD,
PortE,
PortF,
PortG,
PortH,
PortI,
PortJ,
PortK,
NONE
};
enum Pin_e : uint32_t
{
Pin0 = 0, Pin1, Pin2, Pin3, Pin4, Pin5, Pin6, Pin7,
Pin8, Pin9, Pin10, Pin11, Pin12, Pin13, Pin14, Pin15,NONE
};
如果您注意到这里,两个enum的最后一个成员都是NONE。此代码无法编译。给出错误,因为已定义NONE。
有什么方法可以在保持名称不变的情况下构建它?我也不想将类型更改为“枚举类”,因为它会破坏我的应用程序代码的其余部分。
有没有什么方法可以让它在保持名称不变的同时构建?
不是没有变化。如果将< code>Port_e和< code>Pin_e包装在一个命名空间或类中,可以解决名称冲突,但这仍然会改变枚举的使用方式。
我也不想将类型更改为“枚举类”,因为它会破坏我的其余应用程序代码。
我强烈建议您无论如何都要这样做,并花时间修复您的应用程序代码。enum class
正是为了解决这个问题而设计的。
可以使用类枚举或将枚举嵌套在适当的类或命名空间中。
#include <iostream>
enum class A :uint32_t { One, Two, Three };
enum class B :uint32_t { One, Two, Three };
int main()
{
std::cout << int(A::One) << std::endl;
}
枚举的标识符是属于命名空间enum的整数常量的名称。枚举在中声明。类enum改变了这种情况,但不能隐式地从和转换到它们。如果您使用足够简单的名称,任何其他方法最终都会导致ODR中断。在您的代码中,这会导致歧义:NONE是否等于13?还是16岁?