Ошибка компилятора C - инициализатор не является константой - PullRequest
4 голосов
/ 16 декабря 2010

У меня есть функция, используемая для создания нового 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, очевидно, являются константами, которые не должны беспокоить malloc и т. Д. В пре c99 коде C.

Только флаг -Wall.

Спасибо

Ответы [ 2 ]

7 голосов
/ 16 декабря 2010

Вы можете инициализировать глобальные переменные только при их объявлении постоянным значением, которое newGQueue не является.

Это потому, что все глобальные переменные должны быть инициализированы, прежде чем программа сможет начать выполнение. Компилятор принимает любые постоянные значения, назначенные глобальным переменным в их объявлении, и использует это значение в сегменте данных программы , который загружается непосредственно в память загрузчиком ОС при запуске программы. 1008 *

Просто инициализируйте ваше kbdQueue при объявлении NULL и инициализируйте его значением в основной или другой функции запуска.

volatile GQueue * kbdQueue = NULL;

int main() {
    kbdQueue = newGQueue(10,1);
}
3 голосов
/ 16 декабря 2010

Проблема не в аргументах для newGQueue, заключается в использовании возвращаемого значения newGQueue для инициализации kbdQueue.Это исполняемый код, и в Си все инициализаторы должны быть известны во время компиляции.Это проблема только в C;C ++ примет его без проблем.

Если вы разберете объявление и инициализацию, все будет работать нормально.

volatile GQueue * kbdQueue;
kbdQueue = newGQueue(10, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...