c++ enum使用笔记

发布于:2025-03-13 ⋅ 阅读:(20) ⋅ 点赞:(0)


C++中的枚举( enum)是一种取值受限的特殊类型,分为 无作用域枚举有作用域枚举(C++11起)。以下是详细解释及示例:


1. 无作用域枚举 vs. 有作用域枚举

  • 无作用域枚举(传统枚举):
    枚举项直接暴露在外部作用域,可能导致命名冲突。

    enum Color { Red, Green, Blue };  // 定义
    Color c = Red;                     // 直接访问枚举项
    
  • 有作用域枚举(C++11起,enum classenum struct):
    枚举项需通过枚举类型名访问,避免命名冲突。

    enum class Color { Red, Green, Blue };  // 定义
    Color c = Color::Red;                   // 必须通过作用域访问
    

2. 枚举项的初始化规则

  • 默认从0开始递增
    enum { A, B, C };  // A=0, B=1, C=2
    
  • 可手动指定值,后续项自动递增:
    enum HttpCode { OK=200, Created=201, Accepted=202, BadRequest=400 };
    enum { X=5, Y, Z };  // X=5, Y=6, Z=7
    

3. 指定底层类型

  • 控制枚举项的尺寸,默认类型为int(无作用域枚举)或可指定(有作用域枚举):
    enum Direction : char { Up, Down };       // 无作用域,底层类型为char
    enum class Packet : uint8_t { SYN, ACK };  // 有作用域,底层类型为uint8_t
    

4. 类型转换规则

  • 无作用域枚举
    可隐式转换为整型,但整型需显式转换回枚举:

    Color c = Green;
    int i = c;                          // 隐式转换,i=1
    c = static_cast<Color>(2);          // 显式转换,c=Blue
    
  • 有作用域枚举
    必须显式转换与整型互转:

    Color c = Color::Green;
    int i = static_cast<int>(c);        // 显式转换,i=1
    c = static_cast<Color>(2);          // 显式转换,c=Color::Blue
    

5. 枚举的声明与定义

  • 前向声明需指定底层类型(C++11起):
    // 头文件中声明
    enum class LogLevel : int;
    enum Direction : char;
    
    // 源文件中定义
    enum class LogLevel : int { Debug, Info, Warning, Error };
    enum Direction : char { Up, Down };
    

6. 示例对比

无作用域枚举的潜在问题:
enum Light { Red, Green };
enum Signal { Red, Yellow };  // 错误!Red重复定义
有作用域枚举的安全性:
enum class Light { Red, Green };
enum class Signal { Red, Yellow };  // 正确,作用域隔离
Light l = Light::Red;               // 明确作用域

总结

  • 无作用域枚举:简单但易命名冲突,隐式转整型。
  • 有作用域枚举(推荐):类型安全,避免污染作用域,需显式转换。
  • 底层类型:控制枚举项的存储大小,支持前向声明。
  • 初始化:灵活指定值,适用于位掩码或特定编码场景。

网站公告

今日签到

点亮在社区的每一天
去签到