在C语言中如何让单个十六进制值同时用于枚举和const char*
解决方案
方案1:用统一宏维护数值,同时生成枚举与字符串常量
核心是用单个宏定义查找码的数值,基于该宏分别生成枚举成员和字符串常量,只需要维护一套名称:
// 统一定义每个查找码的数值 #define SYSTEM_VAR_1_VAL 0x10 #define SYSTEM_VAR_2_VAL 0x20 // 枚举直接使用宏初始化 typedef enum SystemVariable_e { SYSTEM_VAR_1 = SYSTEM_VAR_1_VAL, SYSTEM_VAR_2 = SYSTEM_VAR_2_VAL // 更多枚举值... } SystemVariable_e; uint16_t ReturnValue(SystemVariable_e lookup_code) { if(lookup_code == SYSTEM_VAR_1) { return system_variable_one; } // 其他分支处理... } // 宏将数值转换为字符,用于字符串拼接 #define CHAR_FROM_VAL(val) ((char)(val)) // 直接拼接生成目标字符串 const char StringToParse[] = "\x01" CHAR_FROM_VAL(SYSTEM_VAR_1_VAL) "\x80"; // 若需要单独定义字符串常量 #define STR_SYSTEM_VAR_1 CHAR_FROM_VAL(SYSTEM_VAR_1_VAL) const char * anotherString = "\x01" STR_SYSTEM_VAR_1 "\x80";
预处理器会直接将CHAR_FROM_VAL(SYSTEM_VAR_1_VAL)替换为(char)0x10,字符串拼接可正常编译。
方案2:编译时指定初始化字符串数组
利用C99及以后支持的指定初始化器,定义一个与枚举值一一对应的字符串数组,直接通过枚举值索引获取字符串:
typedef enum SystemVariable_e { SYSTEM_VAR_1 = 0x10, SYSTEM_VAR_2 = 0x20 // 更多枚举值... } SystemVariable_e; // 字符串数组,索引对应枚举值 const char* system_var_strs[] = { [SYSTEM_VAR_1] = "\x10", [SYSTEM_VAR_2] = "\x20" }; // 使用时直接通过枚举值索引拼接 const char * StringToParse = "\x01" system_var_strs[SYSTEM_VAR_1] "\x80";
如果需要生成单个连续字符串,可在运行时用snprintf拼接:
char StringToParse[10]; snprintf(StringToParse, sizeof(StringToParse), "\x01%c\x80", (char)SYSTEM_VAR_1);
方案3:预处理器令牌拼接简化命名
利用预处理器的令牌拼接功能,自动生成枚举成员和字符串常量的名称,减少重复代码:
// 宏1:生成枚举成员 #define DEFINE_VAR_ENUM(name, val) name = val // 宏2:生成对应的字符串常量 #define DEFINE_VAR_STR(name, val) "\x" #val typedef enum SystemVariable_e { DEFINE_VAR_ENUM(SYSTEM_VAR_1, 0x10), DEFINE_VAR_ENUM(SYSTEM_VAR_2, 0x20) } SystemVariable_e; // 定义字符串常量 #define STR_SYSTEM_VAR_1 DEFINE_VAR_STR(SYSTEM_VAR_1, 0x10) const char * StringToParse = "\x01" STR_SYSTEM_VAR_1 "\x80";
这种方式可以批量定义变量,适合枚举值较多的场景。
内容的提问来源于stack exchange,提问作者Derek Tables
相关产品推荐
相关产品推荐

