【问题标题】:Can two enums not have a member of similar name?两个枚举不能有相似名称的成员吗?
【发布时间】:2019-11-05 14:36:14
【问题描述】:

我有一种情况,我需要两个枚举来保存一个同名成员。我的代码是 C++,使用 IAR Embeddedj Workbench IDE。代码sn-p如下:

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
};

如果您注意到这里两个枚举的最后一个成员都是 NONE。 此代码无法编译。给出错误,因为 NONE 已经定义。

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

【问题讨论】:

    标签: c++ c++11 enums


    【解决方案1】:

    有没有办法让它在保持名称不变的同时构建?

    并非没有变化。如果将 Port_ePin_e 包装在命名空间或类中,则可以解决名称冲突,但这仍会改变枚举的使用方式。

    我也不想将类型更改为“枚举类”,因为它会破坏我的应用程序代码的其余部分。

    无论如何,我强烈建议您这样做,并花时间修复您的应用程序代码。 enum class 正是为解决这个问题而设计的。

    【讨论】:

    • 我会将你的枚举封装在一个命名空间中。
    • @SombreroChicken:抱歉,我的枚举是在private 下声明的。您无权访问它。
    • @VittorioRomeo 感谢您的回复。关于枚举类,您在这里得到了非常有效的观点,我将对此进行研究。只是为了详细说明这两个枚举都在同一个命名空间中。
    【解决方案2】:

    您可以使用类枚举或将枚举嵌套在适当的类或命名空间中。

    #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;
    }
    

    枚举标识符是声明了属于命名空间枚举的整数常量的名称。类枚举改变了这种情况,但你不能隐式地从它们转换到它们。如果您使用简单的 enogh 名称,任何其他方法最终都会导致 ODR 损坏。在您的代码中,它会导致歧义:NONE 是否等于 13?还是到 16 岁?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多