C++中 enum 的使用
C++中的枚举 enum
使用如果没有对应的范围限定,会很容易出现重定义的错误。
如下的重定义错误,在一个文件中有如下两个枚举,编译时会出现重定义错误
enum Type
{
MIN_TYPE,
MAX_TYPE,
INPUT_TYPE
};
enum Mode
{
CITY,
INPUT_TYPE
};
此时虽然是不同的枚举类型,但是 Type::INPUT_TYPE
和 Mode::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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!