*********枚举**********

C++中的枚举变量与枚举成员
文章讨论了C++编程语言中的枚举类型,指出枚举成员是常量无法修改,而枚举变量的值可以被指定但不能随意更改。示例代码展示了如何初始化枚举变量并尝试进行操作,强调了枚举在程序设计中的使用规范。

// *******************************枚举 ************************************************** 
//   枚举变量的值可以改变       枚举成员的值不可以改变  (枚举成员是常量,不能被修改,否则会报错)  //     枚举变量的值必须是指定的值,否则会报错          

   
#include <stdio.h> 
enum DAY { MON=1, TUE, WED, THU, FRI, SAT, SUN } day,name; 
int main() 
{         // 遍历枚举元素
        // 枚举变量是字符串也是数字 
    
    day = MON;    
    //day ++;  C++软件中语*******枚举的值和枚举变量是不可以被修改的,否则会报错
    // ******** visu  stdio  中可以修改枚举变量的值 
    printf("枚举元素:%d\n", day); 
    //printf("枚举元素:%-10s\n", day); 
    name = day;
    if(name==MON )
    {
        printf("枚举元素:%-10s","MON");     
        printf("枚举元素:%d\n", day);        
    }    
    
        //遍历 枚举中的所有元素         (C++软件中枚举变量不能加减,但是记着枚举变量是可以加减的) 
    //     for (day = MON; day <= SUN;day++) 
    //     { 
    //         printf("枚举元素:%d \n", day); 
    //     }
    //

在 C/C++ 中,将 `char*`(字符串)转换为 **枚举常量(enum)** 需要手动实现映射逻辑,因为枚举是编译期常量,无法直接从字符串动态转换。以下是几种常见方法: --- ### **方法 1:手动映射(简单场景)** 使用 `if-else` 或 `switch` 进行字符串与枚举的匹配: ```cpp #include <cstring> // for strcmp enum Color { RED, GREEN, BLUE, UNKNOWN }; Color stringToEnum(const char* str) { if (strcmp(str, "RED") == 0) return RED; else if (strcmp(str, "GREEN") == 0) return GREEN; else if (strcmp(str, "BLUE") == 0) return BLUE; else return UNKNOWN; // 默认 } // 使用示例 const char* input = "GREEN"; Color color = stringToEnum(input); // 返回 GREEN ``` --- ### **方法 2:使用 `std::map`(C++,适合大量枚举)** 通过哈希表存储字符串到枚举的映射,提升效率: ```cpp #include <string> #include <map> enum Language { CPP, JAVA, PYTHON, INVALID }; std::map<std::string, Language> langMap = { {"CPP", CPP}, {"JAVA", JAVA}, {"PYTHON", PYTHON} }; Language parseLanguage(const char* str) { auto it = langMap.find(str); return (it != langMap.end()) ? it->second : INVALID; } // 使用示例 const char* input = "JAVA"; Language lang = parseLanguage(input); // 返回 JAVA ``` --- ### **方法 3:宏或代码生成(复杂项目)** 对于大量枚举,可以通过 **代码生成工具**(如 Python 脚本)自动生成映射代码,避免手动维护。 --- ### **注意事项** 1. **性能**:`strcmp` 或 `map` 查找有开销,高频场景需优化。 2. **大小写敏感**:上述例子区分大小写,如需忽略大小写,可先统一转换为大写/小写。 3. **错误处理**:始终处理无效字符串(如返回 `UNKNOWN` 或抛出异常)。 --- ### **C++17 进阶版(利用 `std::string_view`)** ```cpp #include <string_view> #include <array> enum class LogLevel { DEBUG, INFO, WARNING, ERROR }; constexpr std::array<std::string_view, 4> levelNames = { "DEBUG", "INFO", "WARNING", "ERROR" }; LogLevel parseLogLevel(std::string_view str) { for (size_t i = 0; i < levelNames.size(); ++i) { if (str == levelNames[i]) return static_cast<LogLevel>(i); } throw std::invalid_argument("Invalid log level"); } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

工控技术库

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值