C ++ объект переменного размера не может быть инициализирован - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть следующий простой источник

#include <iostream>

int main() {
    int nv;
    nv = 3;
    int arr[nv] = { 0, 2, 5 };
    return 0;
}

При компиляции с GCC в системе 1 я получаю

error: variable-sized object ‘arr’ may not be initialized.

При компиляции с GCC в системе 2 я не получаю ошибок.

Флаги компиляции одинаковы в обоих случаях, см. Ниже.

В чем причина этого и как я могу заставить мой код компилироваться в системе 1? Я подозревал, что это связано с версией gcc, но я не нашел информации, подтверждающей это подозрение.

В системе 1:

$ g++ --version
g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4
...
$ make
g++ -MMD -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -c -o obj/arrays_test.o src/arrays_test.cc
...

В системе 2:

$ g++ --version
g++ (Ubuntu 5.5.0-12ubuntu1~16.04) 5.5.0 20171010
...
$ make
g++ -MMD -g -g3 -Wall -Wunused -Wuninitialized -Wextra -fmessage-length=0 -std=gnu++11 -c -o obj/arrays_test.o src/arrays_test.cc
...

1 Ответ

0 голосов
/ 17 сентября 2018

Проблема в том, что вы используете не одно, а два расширения.

Первое расширение, как уже отмечалось, заключается в том, что вы используете C99 VLA в C ++. Это задокументированное расширение GCC .

Второе расширение - это то, что даже C99 не позволяет инициализаторы для VLA:

C99 §6.7.8 [Инициализация]

Тип объекта, который должен быть инициализирован, должен быть массивом неизвестных размер или тип объекта , а не массив переменной длины тип.

(В C11 вы найдете это ограничение в §6.7.9). Но, как показывает связанная страница GCC, это не официальное расширение Gnu. Ограничение C99 остается в силе. Вам нужно будет использовать присваивание вместо инициализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...