我想生成一个带有任意逻辑的数组初始化器,不幸的是它需要一些循环。
#define RANDOM_ARRAY(n) \
...
double array[] = RANDOM_ARRAY(10);
假设上面的代码为一个 10 元素数组生成了一个初始化器。是否可以在 C99 中定义这样的宏(带循环)?
注意:如果函数调用就足够了,它不必是宏(但必须可以在全局初始化程序中调用它,而不是在第二个函数中);
不幸的是,不可能在 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;
}
C 预处理器不支持循环,所以你想要的不是(很容易)可能的。
我添加了“(轻松)”,因为有一些方法可以使用诸如boost 的 ITERATE 之类的东西来获得类似循环的行为。这使用递归文件包含来模拟循环。但我不确定你是否想走那么远。
由于您在 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 中,它不会起作用。