【问题标题】:C compiler error - initializer not constantC 编译器错误 - 初始化程序不是常量
【发布时间】:2011-05-26 15:50:35
【问题描述】:

我有一个函数用来创建一个新的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() 不是一个常数。常量在编译时确定,而对函数的调用要到运行时才能发生。
  • 是的,我考虑了一下,这很有意义。那么只能在 C99 上工作?

标签: c compiler-errors


【解决方案1】:

您只能在声明时使用常量值初始化全局变量,newGQueue 不是。

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

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

volatile GQueue * kbdQueue = NULL;

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

【讨论】:

    【解决方案2】:

    问题不在于newGQueue 的参数,而在于使用newGQueue 返回值来初始化kbdQueue。那是可执行代码,在 C 中,所有初始化程序都必须在编译时知道。 这只是 C 语言中的问题; C++ 会毫无问题地接受它。

    如果将声明和初始化分开,它应该可以正常工作。

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

    【讨论】:

    • 据我所知,任何 C“风味”都不接受,仅在 C++ 中。但是现在我很少做旧的 C 代码,所以我不能肯定地回答。不过我知道,C99 放宽了一些旧的 C 限制,使它更像 C++。
    猜你喜欢
    • 2011-09-02
    • 2011-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-22
    • 2020-08-14
    相关资源
    最近更新 更多