提问者:小点点

两个枚举不能有一个同名的成员吗?


我有一种情况,我需要两个枚举来保存一个同名成员。我的代码是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。

有什么方法可以在保持名称不变的情况下构建它?我也不想将类型更改为“枚举类”,因为它会破坏我的应用程序代码的其余部分。


共2个答案

匿名用户

有没有什么方法可以让它在保持名称不变的同时构建?

不是没有变化。如果将< 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岁?