C++的enum枚举数据类型是否可以存储string字符串类型的值?
C++ enum枚举类型存储字符串问题解答
核心结论
- C标准规定,所有枚举类型(包括传统enum和C11引入的enum class)的枚举项底层值必须为整数类型,不支持直接存储字符串类型的值。
- 你提供的测试代码不符合C++语法规则,编译时会直接抛出「枚举项初始化值类型非法」的错误,无法运行。
替代实现方案
如果需要实现枚举值和字符串的绑定映射,可以使用以下两种原生实现方式:
方案1:传统enum + 顺序对应字符串数组
利用枚举项默认从0递增的整数特性,用数组下标做匹配,实现成本最低:
#include <iostream> #include <string> using namespace std; enum month { Jan = 0, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; const string month_str[] = { "Enumeration", "is", "a", "user", "defined", "datatype", "in", "C/C++", "language", "It", "is", "used" }; int main() { month mt = Oct; cout << month_str[mt] << endl; return 0; }
方案2:enum class + 转换函数
类型安全性更高,避免传统枚举的隐式类型转换问题,更适合大型项目使用:
#include <iostream> #include <string> using namespace std; enum class month { Jan = 0, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec }; string month_to_str(month m) { switch(m) { case month::Jan: return "Enumeration"; case month::Feb: return "is"; case month::Mar: return "a"; case month::Apr: return "user"; case month::May: return "defined"; case month::Jun: return "datatype"; case month::Jul: return "in"; case month::Aug: return "C/C++"; case month::Sep: return "language"; case month::Oct: return "It"; case month::Nov: return "is"; case month::Dec: return "used"; default: return ""; } } int main() { month mt = month::Oct; cout << month_to_str(mt) << endl; return 0; }
内容的提问来源于stack exchange,提问作者Danish Shaikh
相关产品推荐
相关产品推荐

