2013-05-14 43 views
2

我想用任意逻辑生成一个数组初始值设定项,不幸的是需要一些循环。在C99宏中循环构造

#define RANDOM_ARRAY(n) \ 
    ... 

double array[] = RANDOM_ARRAY(10); 

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

注意:如果函数调用可以满足,它不一定是宏(但它必须可以在全局初始化器中调用,而不是在第二个函数中调用);

+0

看来你想用随机值填充任意大小的数组。从我的理解,当你在C中声明一个全局或静态数组时,不会发生这种情况吗?如果是这种情况,除了声明一个大小为“n”的数组并且它已经被随机值填充之外,你不需要额外做任何事情。 – mmoore 2013-05-14 12:49:22

+0

@ Ph4g3:indeterminate与随机 – 2013-05-14 12:51:11

+0

不一样,假设我不想输入'array [] = {sin(1),sin(2),sin(3)...,sin(10)}; ' – Yanko 2013-05-14 12:51:45

回答

2

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

我添加了'(容易)',因为有些方法可以使用像boost's ITERATE这样的类似于循环的行为。这使用递归文件包含模拟一个循环。但我不确定你是否想要走这么远。

+0

Boost是C吗? – Yanko 2013-05-14 12:45:18

+0

@Yanko:[boost预处理程序](http://www.boost.org/libs/preprocessor/)库是 – 2013-05-14 12:48:46

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; 
} 
+0

不会产生这种结果int'int tab [3] = {INITIALIZER_3}'? – Yanko 2013-05-14 13:19:46

+0

它应该给'int标签[3] = {1,2,3}' – 2013-05-14 13:21:29

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中,它不会起作用。

+0

你需要'do'和'for'? – Yanko 2013-05-14 12:58:17