繁体   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