2010-12-16 94 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