【问题标题】:Array Initialization Macro数组初始化宏
【发布时间】:2011-02-09 18:24:26
【问题描述】:

我正在尝试提出一个宏来执行以下操作,

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?

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

【问题讨论】:

  • 你的宏到底是做什么的?
  • 您想要的对于任意数量的参数是不可能的,正如所写的那样,但我很困惑为什么要将指向每个数组元素的单独指针传递给函数调用。只需传递一个指向第一个元素的指针就可以了。

标签: c++ c c-preprocessor


【解决方案1】:

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

等等。

【讨论】:

  • 我在几分钟前编辑了答案,试图解决您问题的第二部分。请看看这是否也有效。
  • 编辑了问题我有一个宏来计算另一个问题的参数数量,但我坚持调用 my_call
  • 我在回答中展示了一个蛮力解决方案。它可能足以解决您的问题。
  • 我只是为迭代部分添加了一些更好的东西。
  • 代替为 C++ 设计的 boost,您可以使用 P99,它使用 va_arg 宏和您在问题中指向的技巧来计算参数,然后执行“代码展开”。参见例如我在这里给出的答案:stackoverflow.com/questions/4904255/…
猜你喜欢
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
  • 2020-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多