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

如何将可变参数宏的所有参数拼接为一个带引号的字符串?

可变参数版字符串拼接宏实现

要实现支持任意数量参数的CONCAT_STRINGIFY宏,可借助C/C++预处理器的可变参数特性、宏递归展开及字符串化间接处理技巧完成,具体实现如下:

完整宏定义

// 基础字符串化宏(直接将参数转为字符串,不展开参数本身)
#define TO_STRING(x) #x
// 间接字符串化宏(先展开参数,再执行字符串化)
#define STRINGIFY(x) TO_STRING(x)

// 可变参数拼接的递归终止宏
#define CONCAT_NEXT(...)
// 可变参数拼接核心逻辑:逐个拼接参数
#define CONCAT_IMPL(first, ...) first ## CONCAT_NEXT(__VA_ARGS__)
// 可变参数拼接入口宏
#define CONCAT_ALL(...) CONCAT_IMPL(__VA_ARGS__)

// 最终的可变参数字符串拼接宏
#define CONCAT_STRINGIFY(...) STRINGIFY(CONCAT_ALL(__VA_ARGS__))

工作原理

  1. CONCAT_ALL:作为可变参数拼接的入口,将传入的所有参数传递给CONCAT_IMPL展开处理。
  2. CONCAT_IMPL:每次取出第一个参数,通过预处理器拼接操作符##,将其与剩余参数的拼接结果合并,递归调用CONCAT_NEXT处理后续参数。
  3. CONCAT_NEXT:递归终止条件,当没有剩余参数时,空宏会终止拼接链。
  4. STRINGIFY与TO_STRING:STRINGIFY先让预处理器完成参数的拼接展开,再通过TO_STRING将最终拼接结果转换为带引号的字符串(直接使用TO_STRING会阻止参数的展开操作)。

测试示例

调用不同参数数量的宏:

// 单个参数
CONCAT_STRINGIFY(AAA)
// 三个参数
CONCAT_STRINGIFY(AAA, BBB, CCC)
// 混合字符与下划线参数
CONCAT_STRINGIFY(Hello, _, World, _, 2024)

预处理器输出结果分别为:

"AAA"
"AAABBBCCC"
"Hello_World_2024"

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 07:00:59