C++中 enum 的使用

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 的方式,即限域枚举

与限域枚举相对的是非限域枚举:

// Color为非限域枚举
enum Color
{
    one,
    two,
    three
};

// 此时会报变量"two"重定义,已经在枚举Color中定义过,因为此时Color中的枚举值并不是只是限制在该枚举域中
auto two=10;

// Res为限域枚举,其中值的作用域只是位于该枚举中,不会污染整个文件
enum class Res
{
    five,
    six,
    seven
};
// 可正常使用,因为Res::six只在对应的枚举作用域内
auto six = false;

enum class enumName 枚举类是 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
  • 枚举类可以进行前置声明,而不必先定义,如enum class MyEnum; 只是声明,后面再进行定义

[参考资料]
-优先考虑限域enum而非未限域enum

posted @ 2023-12-03 23:22  Jeffxue  阅读(142)  评论(0编辑  收藏  举报