Skip to content

enum class(C++11)

一句话

带作用域的枚举类型,解决传统 enum 枚举值污染全局命名空间和隐式转换为整数的问题。

头文件

无需头文件(语言关键字)

核心 API 速查

操作签名说明
声明enum class Name { A, B, C };基础作用域枚举,默认底层类型为 int
指定底层类型enum class Name : uint8_t { A, B };固定底层类型,节省内存
访问枚举值Name::A必须通过作用域运算符访问
转为整数static_cast<int>(Name::A)必须显式转换,无隐式转换
不透明声明enum class Name : uint8_t;前向声明,需指定底层类型
using enumusing enum Name;(C++20) 将枚举值引入当前作用域

最小示例

cpp
// Standard: C++11
#include <iostream>

int main() {
    enum class Color : uint8_t { red, green = 20, blue };
    Color r = Color::blue;

    switch (r) {
        case Color::red:   std::cout << "red\n";   break;
        case Color::green: std::cout << "green\n"; break;
        case Color::blue:  std::cout << "blue\n";  break;
    }

    // int n = r; // error
    int n = static_cast<int>(r);
    std::cout << n << '\n'; // 21
}

嵌入式适用性:高

  • 指定底层类型(如 uint8_tuint32_t)可精确控制内存占用,适合协议解析和寄存器映射
  • 零运行时开销,编译期完全展开
  • 消除命名冲突,适合大型嵌入式项目的模块化开发
  • 显式类型转换避免意外的整数比较,提升代码安全性

编译器支持

GCCClangMSVC
4.73.12010

另见


部分内容参考自 cppreference.com,采用 CC-BY-SA 4.0 许可

基于 VitePress 构建