2010-12-16 91 views
4

我用一个函数来创建一个新的GQueueC编译器错误 - 初始化不恒定

GQueue* newGQueue(int n_ele, int ele_size) 
{ 
    GQueue* q = (GQueue*) malloc(sizeof(GQueue)); 
    if(!q) return NULL; 

    q->ptr = malloc(n_ele * ele_size); 
    if(!(q->ptr)) 
    { 
     free(q); 
     return NULL; 
    } 

    q->in = q->out = q->count = 0; 
    q->size = n_ele; q->ele_size = ele_size; 

    return q; 
} 

我用这样的:

volatile GQueue * kbdQueue = newGQueue(10, 1);

然而,在出现下列编译错误此行:

Error: initializer element not constant

这是为什么发生? 10和1显然是常量,不应该在 C代码中打扰malloc等。

只有标志是-Wall

感谢

+1

我相信这是说'newGQueue()'不是一个常量。常量是在编译时确定的,而直到运行时才能调用函数。 – Gabe 2010-12-16 16:22:17

+0

是的,我给了它一些想法,它是有道理的。那么只适用于C99? – 2010-12-16 16:24:16

回答

7

您只能初始化全局变量在他们的声明与一个恒定的值,这newGQueue不是。

这是因为所有全局变量必须在程序开始执行之前进行初始化。编译器在其声明中使用分配给全局变量的任意常量值,并在程序运行时使用程序的data segment中的该值,该值由OS loader直接加载到内存中。

只需将声明中的kbdQueue初始化为NULL,并将其初始化为main或其他启动函数中的值即可。

volatile GQueue * kbdQueue = NULL; 

int main() { 
    kbdQueue = newGQueue(10,1); 
} 
3

的问题是不是在论据newGQueue,是使用newGQueue返回值来初始化kbdQueue。这是可执行代码,并且在C中,所有初始化器都必须在编译时知道。 这只是C中的一个问题; C++会毫无问题地接受它。

如果你分解声明和初始化它应该工作正常。

volatile GQueue * kbdQueue; 
kbdQueue = newGQueue(10, 1); 
+0

仅适用于C99? – 2010-12-16 16:24:40

+0

据我所知,任何C“味道”都不接受,只有在C++中。但是现在我做了一些老旧的C代码,所以我无法肯定地回答。但我知道,C99放宽了一些旧的C限制,使其更像C++。 – 2010-12-16 16:35:38