You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将C字符串作为已定义宏的前缀拼接获取对应宏值

C 语言的宏是预处理阶段的文本替换特性,仅在编译执行前对代码做纯文本处理,完全无法感知运行时的变量值。你提供的原始代码存在两个核心问题:

  1. 宏拼接符##只会对传入的参数做纯文本拼接,你传入name_a作为参数时,预处理阶段会直接拼接出name_a_NUM,而非你想要的AAA_NUM
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 22:15:03