我正在尝试使用宏来执行以下操作,
MY_MACRO(type,name,args...)
MY_MACRO(int,_array,1,2,3)
并扩展为,
int _array[] = {1,2,3};
coll* __array = my_call(&array[0],&array[1],&array[2]);
是否可以使用/不使用编译器特定的魔法?
my_call需要可变数量的参数,我不想直接传递数组。
编辑:我已经使用以下SO问题中接受的答案为var args,
Macro returning the number of arguments it is given in C?
所以我可以找到数组中有多少元素。
答案 0 :(得分:3)
您可以从(C99,而非GCC特定)开始:
#define MY_MACRO(type, name, ...) \
type name[] = {__VA_ARGS__};
my_call
部分将更加困难;有在线的宏可以计算参数的数量,但你需要像Boost.Preprocessor(它应该在C中工作)的东西将my_call
应用于数组的连续元素。你有多少元素作为最大值?您可能需要以下内容:
#define COUNT(...) COUNT2(__VA_ARGS__, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0)
#define COUNT2(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, count, ...) count
#define PP_CAT(a, b) PP_CAT2(a, b)
#define PP_CAT2(a, b) a ## b
#define CALL_MY_FUNC(arr, ...) my_call(PP_CAT(ITER_, COUNT(__VA_ARGS__))(arr));
#define ITER_0(arr) /**/
#define ITER_1(arr) (arr)
#define ITER_2(arr) (arr), ITER_1((arr) + 1)
#define ITER_3(arr) (arr), ITER_2((arr) + 1)
#define ITER_4(arr) (arr), ITER_3((arr) + 1)
等等。