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

如何在C语言中合并两个宏以初始化字符串数组?

实现方法

要实现两个宏的合并生成目标数组,核心是利用宏的嵌套展开,让每个T元素和所有K元素逐一组合。具体步骤如下:

1. 定义组合生成的核心宏

需要两个辅助宏来完成组合逻辑:

  • COMBINE_ACTION:负责生成单个数组项,将传入的T、K字符串拼接,数值相加作为下标。
  • GENERATE_COMBINED:接收单个T的字符串和数值,内部调用FOREACH_K并传入COMBINE_ACTION,让当前T和所有K完成组合。

代码示例:

// 生成单个数组项:[t_val + k_val] = "t_str_k_str"
#define COMBINE_ACTION(t_str, t_val, k_str, k_val) \
    [t_val + k_val] = t_str "_" k_str,

// 针对单个T元素,遍历所有K元素生成组合
#define GENERATE_COMBINED(t_str, t_val) \
    FOREACH_K(COMBINE_ACTION(t_str, t_val))

2. 展开宏生成目标数组

通过FOREACH_T调用GENERATE_COMBINED,就能让每个T元素和所有K元素完成组合,最终生成目标数组:

#define FOREACH_T(ACTION) \
ACTION("T1", 1) \
ACTION("T2", 2) \
ACTION("T3", 3) 

#define FOREACH_K(ACTION) \
ACTION("K1", 17) \
ACTION("K2", 20) \
ACTION("K3", 23) 

// 生成目标数组
const char* value[] = {
    FOREACH_T(GENERATE_COMBINED)
};

宏展开后的效果

预处理器会把上述代码展开成你期望的形式:

const char* value[] = {
    [1 + 17] = "T1" "_" "K1", [1 + 20] = "T1" "_" "K2", [1 + 23] = "T1" "_" "K3",
    [2 + 17] = "T2" "_" "K1", [2 + 20] = "T2" "_" "K2", [2 + 23] = "T2" "_" "K3",
    [3 + 17] = "T3" "_" "K1", [3 + 20] = "T3" "_" "K2", [3 + 23] = "T3" "_" "K3",
};

C语言会自动拼接相邻的字符串字面量,所以"T1" "_" "K1"等价于"T1_K1"。

注意事项

  • 该写法依赖C99及以后的标准(支持指定下标初始化数组)。
  • 若需兼容更早的C标准,需先计算所有下标的最大值,初始化足够大的数组后逐个赋值,这种方式会相对繁琐。

内容的提问来源于stack exchange,提问作者antho

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 04:35:15