我想用任意逻辑生成一个数组初始值设定项,不幸的是需要一些循环。在C99宏中循环构造
#define RANDOM_ARRAY(n) \
...
double array[] = RANDOM_ARRAY(10);
假设上面的代码为10个元素的数组生成一个初始值设定项。是否有可能在C99中定义这样一个宏(带循环)?
注意:如果函数调用可以满足,它不一定是宏(但它必须可以在全局初始化器中调用,而不是在第二个函数中调用);
我想用任意逻辑生成一个数组初始值设定项,不幸的是需要一些循环。在C99宏中循环构造
#define RANDOM_ARRAY(n) \
...
double array[] = RANDOM_ARRAY(10);
假设上面的代码为10个元素的数组生成一个初始值设定项。是否有可能在C99中定义这样一个宏(带循环)?
注意:如果函数调用可以满足,它不一定是宏(但它必须可以在全局初始化器中调用,而不是在第二个函数中调用);
C预处理器不支持循环,所以你想要的不是(很容易)。
我添加了'(容易)',因为有些方法可以使用像boost's ITERATE这样的类似于循环的行为。这使用递归文件包含模拟一个循环。但我不确定你是否想要走这么远。
Boost是C吗? – Yanko 2013-05-14 12:45:18
@Yanko:[boost预处理程序](http://www.boost.org/libs/preprocessor/)库是 – 2013-05-14 12:48:46
不幸的是,这是不可能尽管如此创建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;
}
不会产生这种结果int'int tab [3] = {INITIALIZER_3}'? – Yanko 2013-05-14 13:19:46
它应该给'int标签[3] = {1,2,3}' – 2013-05-14 13:21:29
既然你在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中,它不会起作用。
你需要'do'和'for'? – Yanko 2013-05-14 12:58:17
看来你想用随机值填充任意大小的数组。从我的理解,当你在C中声明一个全局或静态数组时,不会发生这种情况吗?如果是这种情况,除了声明一个大小为“n”的数组并且它已经被随机值填充之外,你不需要额外做任何事情。 – mmoore 2013-05-14 12:49:22
@ Ph4g3:indeterminate与随机 – 2013-05-14 12:51:11
不一样,假设我不想输入'array [] = {sin(1),sin(2),sin(3)...,sin(10)}; ' – Yanko 2013-05-14 12:51:45