2

我想生成一个带有任意逻辑的数组初始化器,不幸的是它需要一些循环。

#define RANDOM_ARRAY(n) \
    ...

double array[] = RANDOM_ARRAY(10);

假设上面的代码为一个 10 元素数组生成了一个初始化器。是否可以在 C99 中定义这样的宏(带循环)?

注意:如果函数调用就足够了,它不必是宏(但必须可以在全局初始化程序中调用它,而不是在第二个函数中);

4

3 回答 3

3

不幸的是,不可能在 C 中创建递归(或循环)宏函数。不过,如果您的初始化程序有一个合理的最大长度,您可以使用这种类型的构造:

#define INITIALIZER(N)  { INITIALIZER_ ## N }
#define INITIALIZER_1   1
#define INITIALIZER_2   INITIALIZER_1, 2
#define INITIALIZER_3   INITIALIZER_2, 3


int
main(void)
{
    int tab[3] = INITIALIZER(3);

    return 0;
}
于 2013-05-14T12:45:32.410 回答
2

C 预处理器不支持循环,所以你想要的不是(很容易)可能的。

我添加了“(轻松)”,因为有一些方法可以使用诸如boost 的 ITERATE 之类的东西来获得类似循环的行为。这使用递归文件包含来模拟循环。但我不确定你是否想走那么远。

于 2013-05-14T12:44:01.327 回答
1

由于您在 C99 中工作,因此您当然可以创建一个执行初始化的宏,但您无法使其看起来像一个初始化程序:

#define INCREMENTING_ARRAY(t,a,n)    t a[n]; do {\
                                     for(size_t i = 0; i < n; ++i)\
                                       a[i] = i;\
                                     } while(0);

例如,这将创建一个数组,其元素被初始化为递增。

用法:

int main(void)
{
  INCREMENTING_ARRAY(int, dozen, 12);
  int i;

  for(i = 0; i < sizeof dozen / sizeof *dozen; ++i)
    printf("array at %d = %d\n", i, dozen[i]);

  return 0;
}

这很有效,因为在 C99 中您可以自由地混合声明和代码,因此int i; 使用宏之后就可以了。在 C89 中,它不会起作用。

于 2013-05-14T12:54:08.483 回答