簡體   English   中英

C編譯器錯誤 - 初始化程序不是常量

[英]C compiler error - initializer not constant

我有一個用於創建新GQueue

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顯然是常量,不應該在前c99 C代碼中打擾malloc等。

只有標志是-Wall

謝謝

您只能使用常量值在其聲明中初始化全局變量,而newGQueue則不是。

這是因為在程序開始執行之前必須初始化所有全局變量。 編譯器在其聲明中獲取分配給全局變量的任何常量值,並在程序的數據段中使用該值,該數據段在程序運行時由OS加載程序直接加載到內存中。

只需在聲明時將kbdQueue初始化為NULL,並將其初始化為main或其他啟動函數中的值。

volatile GQueue * kbdQueue = NULL;

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

問題不在於newGQueue的參數,而是使用newGQueue返回值來初始化kbdQueue。 這是可執行代碼,在C中,必須在編譯時知道所有初始化程序。 這只是C中的一個問題; C ++會毫無問題地接受它。

如果你拆分聲明和初始化它應該工作正常。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM