数组初始化宏

发布于 2024-10-16 13:14:01 字数 514 浏览 2 评论 0原文

我试图想出一个宏来做类似下面的事情,

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,

宏返回 C 中给出的参数数量?

这样我就可以找到数组中有多少个元素。

I am trying to come up with a macro to do something like the following,

MY_MACRO(type,name,args...)
MY_MACRO(int,_array,1,2,3)

and expand to,

int _array[] = {1,2,3};
coll* __array = my_call(&array[0],&array[1],&array[2]);

is this possible with/without compiler specific magic?

my_call expects variable number of arguments and I do not want to pass the array directly.

EDIT: I am already using the accepted answer from the following SO question for var args,

Macro returning the number of arguments it is given in C?

So I can find how many elements are in the array.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

樱花细雨 2024-10-23 13:14:01

您可以从(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)

等等。

You can start with (C99, not GCC-specific):

#define MY_MACRO(type, name, ...) \
  type name[] = {__VA_ARGS__};

The my_call part will be more difficult; there are macros online that can count the number of arguments, but you will need something like Boost.Preprocessor (which should work in C) to apply my_call to the consecutive elements of the array. How many elements do you have as a maximum? You might want something like:

#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)

and so on.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文