将任意数量的args传递给函数

时间:2017-07-14 01:40:08

标签: c function macros variadic variadic-macros

基本上,我想使用宏重新定义这部分代码,

switch(count) {
case 0:
 variadic();
case 1:
 variadic(array[0]);
case 2;
 variadic(array[0], array[1]);
case 3:
 variadic(array[0], array[1], array[2]);
...
}

我的约束是variadic是一个不能传递计数的函数,所以我不能通过引用传递数组。这种方式运行得很好,但我想知道我是否可以使用宏来做到这一点,或者以更好的方式,我不介意参数的数量是否有限,因为现在,我只能处理6个。 / p>

谢谢。

1 个答案:

答案 0 :(得分:0)

类似variadic_(8,array),扩展为variadic(array [0],array [1],array [2],array [3],array [4],array [5],array [6] ,array [7],array [8]);

使用boost预处理器,您只需执行此操作:

#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/tuple/pop_front.hpp>

#define TO_ARRAY(_,N,V) ,V[N]
#define variadic_(C,A) \
   variadic BOOST_PP_TUPLE_POP_FRONT((BOOST_PP_REPEAT(C,TO_ARRAY,A)));

(删除BOOST_PP_进行讨论)

REPEAT(3,TO_ARRAY,array)生成一个计数列表,扩展为:

TO_ARRAY(,0,array) TO_ARRAY(,1,array) TO_ARRAY(,2,array)

...每个#都是一些你应该忽略的数字(与嵌套宏有关,但你真的不关心它)。

使用定义的TO_ARRAY,这会扩展为,array[0],array[1],array[2];用括号括起来的是一个元组。这有一个额外的引号,TUPLE_POP_FRONT剥离。

作为一个极端情况,如果您传入0,则会构建元组()TUPLE_POP_FRONT只会映射回()