C++中 enum 的使用

发布时间 2023-12-03 23:25:34作者: Jeffxue

C++中的枚举 enum使用如果没有对应的范围限定,会很容易出现重定义的错误。
如下的重定义错误,在一个文件中有如下两个枚举,编译时会出现重定义错误

enum Type
{
    MIN_TYPE,
    MAX_TYPE,
    INPUT_TYPE
};

enum Mode
{
    CITY,
    INPUT_TYPE
};

此时虽然是不同的枚举类型,但是 Type::INPUT_TYPEMode::INPUT_TYPE 由于是相同的枚举值,会出现如下的报错: “INPUT_TYPE”: 重定义;

因此需要为该枚举加上命名空间或者枚举类来解决 不同枚举类型的相同枚举值导致的重定义问题。

1. 枚举加上命名空间

// 如果有相同的枚举值,需要将其放在不同的命名空间中
namespace MySpaceA
{
    enum Type
    {
        MIN_TYPE,
        MAX_TYPE,
        INPUT_TYPE
    };
}

namespace MySpaceB
{
    enum Mode
    {
        CITY,
        INPUT_TYPE
    };
}


// 在函数中使用是通过 命名空间::枚举名::枚举值
MySpaceA::Type::INPUT_TYPE;
MySpaceB::Mode::INPUT_TYPE;

该方式使用枚举值可以自动隐式将其转换成 int 类型

2. 枚举类 enum class 的方式

枚举类是 C++11 所提供的方法

// 如果有相同的枚举值,可以使用枚举类来处理
enum class Type
{
    MIN_TYPE,
    MAX_TYPE,
    INPUT_TYPE
};

enum class Mode
{
    CITY,
    INPUT_TYPE
};

// 在函数中使用是通过 枚举名::枚举值
Type::INPUT_TYPE;
Mode::INPUT_TYPE;

枚举类的方式无法隐式自动将枚举值转换成 int 类型,需要显式的进行转换(int)Type::INPUT_TYPE