数组初始化宏

时间:2011-02-09 18:24:26

标签: c++ c c-preprocessor

我正在尝试使用宏来执行以下操作,

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?

所以我可以找到数组中有多少元素。

1 个答案:

答案 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)

等等。