C - 以不同方式处理最后一个参数的可变参数宏



如果有一种方法可以定义以不同方式处理其最后一个参数的可变参数宏,我正在徘徊。

例如,我是否可以定义一个宏,该宏在每个参数(最后一个参数除外(之后打印自定义分隔符?

即如何定义宏:

MACRO(a, lot, of, bars)

为了生成此输出:

a|lot|of|bars

(编辑:评论向我指出,,作为分隔符的情况是微不足道的(

您可以应用宏参数计数技巧。对于最多五个宏参数(原始答案支持 4 个宏参数,因此您可以查看差异以了解如何扩展宏以获取其他参数(:

#define MACRO(...) MACRO_X(__VA_ARGS__,5,4,3,2,1)(__VA_ARGS__)
#define MACRO_X(_5,_4,_3,_2,_1,X,...) MACRO_##X
#define MACRO_5(X,...) X|MACRO_4(__VA_ARGS__)
#define MACRO_4(X,...) X|MACRO_3(__VA_ARGS__)
#define MACRO_3(X,...) X|MACRO_2(__VA_ARGS__)
#define MACRO_2(X,...) X|MACRO_1(__VA_ARGS__)
#define MACRO_1(X,...) X

要创建字符串,可以使用"stringify"运算符:

#define STR2(X) STR(X)
#define STR(X) #X

所以:

puts(STR2(MACRO(a,lot,of,bars)));

如果输出不需要字符串化,那么您可以相对简单地生成等效表达式:

#define MACRO(...) BIGMACRO(__VA_ARGS__,0,0,0,0,0,0,0,0)
#define BIGMACRO(a0,a1,a2,a3,a4,a5,a6,a7,...) a0|a1|a2|a3|a4|a5|a6|a7

所以MACRO(a,lot,of,bars)扩展到a|lot|of|bars|0|0|0|0,它与a|lot|of|bars具有相同的类型和值。

最新更新