如何将C字符串作为已定义宏的前缀拼接获取对应宏值
C 语言的宏是预处理阶段的文本替换特性,仅在编译执行前对代码做纯文本处理,完全无法感知运行时的变量值。你提供的原始代码存在两个核心问题:
- 宏拼接符
##只会对传入的参数做纯文本拼接,你传入name_a作为参数时,预处理阶段会直接拼接出name_a_NUM,而非你想要的AAA_NUM name_a、name_b是运行时才会赋值的字符串变量,预处理器执行时这些变量还不存在,更不可能读取它们的字符串值做拼接
方案1:仅编译期使用,无需运行时字符串变量
如果你的使用场景不需要传入运行时字符串变量,直接传入标识符字面量即可实现需求,修改后的代码如下:
#define AAA_NUM 10 #define BBB_NUM 20 #define PREFIX_NUM(prefix) prefix##_NUM int main() { // 直接传入标识符作为宏参数即可 printf("AAA_NUM: %d\n", PREFIX_NUM(AAA)); printf("BBB_NUM: %d\n", PREFIX_NUM(BBB)); return 0; }
该代码编译运行后即可输出你期望的结果。
方案2:需要支持运行时字符串变量匹配
如果必须使用运行时的char*参数来获取对应数值,无法通过纯宏实现,需要搭配运行时查表逻辑:
#include <stdio.h> #include <string.h> #define AAA_NUM 10 #define BBB_NUM 20 // 定义前缀与数值的映射表 typedef struct { const char* prefix; int value; } NumMap; static const NumMap num_map[] = { {"AAA", AAA_NUM}, {"BBB", BBB_NUM}, {NULL, 0} // 哨兵位标记表结束 }; // 运行时查找对应前缀的数值 int get_prefix_num(const char* prefix) { for (int i = 0; num_map[i].prefix; i++) { if (!strcmp(num_map[i].prefix, prefix)) { return num_map[i].value; } } return -1; // 未匹配到的默认返回值 } int main() { char *name_a = "AAA"; char *name_b = "BBB"; // 你原代码中此处误写为"AAA",已修正 printf("AAA_NUM: %d\n", get_prefix_num(name_a)); printf("BBB_NUM: %d\n", get_prefix_num(name_b)); return 0; }
运行后输出和预期完全一致。
内容的提问来源于stack exchange,提问作者old cat
相关产品推荐
相关产品推荐

