多个枚举

Multiple enumerations

本文关键字:枚举      更新时间:2023-10-16

我想知道我是否可以在已经存在的同一文件中使用不同的枚举?

对于这个项目,我有一些元素可以作为许多书籍的类型。我想为这些书创建不同的故事,并为它们创建一个第二个枚举。

enum element {
    ICE, FIRE, EARTH, WIND, NONE
};
enum book stories {
    FK, IK, EK, WK, NONE
};

这会让我的编译器出现问题吗?

是的。枚举NONE存在于elementbook stories中(顺便说一句,您不能用空格命名枚举)。

枚举类

如果要在两个枚举中使用NONE,请使用 enum class es。

enum class element 
{
    ICE, FIRE, EARTH, WIND, NONE
};
enum class bookstories 
{
    FK, IK, EK, WK, NONE
};

然后像这样使用枚举:

auto elem  = element::NONE;
auto story = bookstories::NONE;

撇开book stories引起的语法错误不谈,您可以通过将它们放入作用域来使enum声明明确:

struct Elements {
    enum element {
        ICE, FIRE, EARTH, WIND, NONE
    };
};
struct BookStories {
    enum book_stories {
        FK, IK, EK, WK, NONE
    };
};

那么提到Elements::NONEBookStories::NONE将是明确的。


使枚举作用域化的另一种方法是使用 enum class(从 c++11 开始):

enum class element {
    ICE, FIRE, EARTH, WIND, NONE
};
enum class book_stories {
    FK, IK, EK, WK, NONE
};

这通常通过这样做来解决:

typedef enum element_e {
  E_ELEMENT_ERROR = -1,
  E_ELEMENT_NONE,
  /* ... */
} element_t;
typedef enum bookstories_e {
  E_BOOKSTORIES_ERROR = -1,
  E_BOOKSTORIES_NONE,
  /* ... */
} bookstories_t;

因此,您可以在头文件中维护C/C++互操作。如果您没有任何 C 模块,请使用枚举类,如其他答案所述。