如何为C预处理器列表的每个元素添加前缀/后缀(如&或引号)?
C预处理器批量为列表元素添加前缀/后缀方案
要实现给VARLIST的每个元素批量添加前缀(&)或前后缀(双引号),可以利用预处理器的递归宏和参数计数技巧解决,以下是具体实现:
一、生成带&前缀的VARLIST_PTR
// 递归处理单个元素加&,按参数个数匹配对应宏 #define _ADD_PREFIX_1(elem) &elem #define _ADD_PREFIX_2(elem, rest...) &elem, _ADD_PREFIX_1(rest) #define _ADD_PREFIX_3(elem, rest...) &elem, _ADD_PREFIX_2(rest) // 可按需扩展_ADD_PREFIX_4、_ADD_PREFIX_5等支持更多元素 // 自动匹配对应参数数量的处理宏 #define _GET_PREFIX_MACRO(_1,_2,_3,N,...) _ADD_PREFIX_##N #define ADD_PREFIX(...) _GET_PREFIX_MACRO(__VA_ARGS__, _ADD_PREFIX_3, _ADD_PREFIX_2, _ADD_PREFIX_1)(__VA_ARGS__) // 定义原始变量列表 #define VARLIST var_one, var_two, var_three // 生成目标宏VARLIST_PTR #define VARLIST_PTR ADD_PREFIX(VARLIST)
展开后VARLIST_PTR会被替换为:&var_one, &var_two, &var_three
二、生成带双引号的VARLIST_QUOTED
利用预处理器的字符串化操作符#,实现类似的递归处理:
// 递归处理单个元素加双引号 #define _ADD_QUOTES_1(elem) #elem #define _ADD_QUOTES_2(elem, rest...) #elem, _ADD_QUOTES_1(rest) #define _ADD_QUOTES_3(elem, rest...) #elem, _ADD_QUOTES_2(rest) // 同样可按需扩展支持更多元素 #define _GET_QUOTES_MACRO(_1,_2,_3,N,...) _ADD_QUOTES_##N #define ADD_QUOTES(...) _GET_QUOTES_MACRO(__VA_ARGS__, _ADD_QUOTES_3, _ADD_QUOTES_2, _ADD_QUOTES_1)(__VA_ARGS__) // 生成目标宏VARLIST_QUOTED #define VARLIST_QUOTED ADD_QUOTES(VARLIST)
展开后VARLIST_QUOTED会被替换为:"var_one", "var_two", "var_three"
关键说明
- 核心思路是通过参数计数宏
_GET_XXX_MACRO,根据输入的元素个数自动选择对应的递归处理宏,逐个为元素添加前缀/后缀。 - 如果你的VARLIST元素数量超过3个,只需要继续扩展
_ADD_PREFIX_N和_ADD_QUOTES_N系列宏,并在_GET_XXX_MACRO的参数列表中添加对应的选项即可。 - 之前尝试失败的原因是没有递归遍历所有元素,且未处理不同参数数量的适配,导致预处理器无法正确展开全部元素。
内容的提问来源于stack exchange,提问作者sdbbs
相关产品推荐
相关产品推荐

