如何将可变参数宏的所有参数拼接为一个带引号的字符串?
可变参数版字符串拼接宏实现
要实现支持任意数量参数的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__))
工作原理
CONCAT_ALL:作为可变参数拼接的入口,将传入的所有参数传递给CONCAT_IMPL展开处理。CONCAT_IMPL:每次取出第一个参数,通过预处理器拼接操作符##,将其与剩余参数的拼接结果合并,递归调用CONCAT_NEXT处理后续参数。CONCAT_NEXT:递归终止条件,当没有剩余参数时,空宏会终止拼接链。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
相关产品推荐
相关产品推荐

