Инициализированный массив переменной длины, работающий по-разному (между компьютерами)

У меня есть код, который инициализирует массивы, в частности C-строки, с использованием переменных. Например...

int len = getLength();
char cstr[len+1] = {'\0'};

Это компилируется и безупречно работает в моем коде. Однако, когда один из моих коллег запускает тот же код, он получает ошибку компилятора...

Объект переменного размера не может быть инициализирован

Мы оба используем Ubuntu и GCC/G++. Мы сравнили флаги компилятора и оба используем --std=c++11. Все остальные флаги тоже одинаковые (-Wall, -Wextra и -g).

Почему этот код работает только на моем компьютере, а не на его? Как я могу заставить его работать?


person CodeMouse92    schedule 06.11.2015    source источник


Ответы (1)


Это случай разных версий компилятора. Когда мы оба запустили g++ --version в наших терминалах, мы обнаружили, что он запускал 4.8, а я запускал 4.9.

GCC уже давно поддерживает C99 массива переменной длины (VLA), где переменная объявляется, но не получает список инициализации. Таким образом, мой коллега мог устранить ошибки, удалив {'\0'); из каждой инициализации (что также нарушило код в этом случае).

Однако в прошлом GCC не поддерживал C++1y VLA, как это было в примере в вопросе. Они только что добавили поддержку GCC 4.9 (см. журнал изменений).

Ubuntu 14.04 (то, что есть у моего коллеги) поставляется с GCC 4.8, а Ubuntu 15.04 (то, что есть у меня) поставляется с GCC 4.9. Таким образом, нам пришлось перейти на ту же версию компилятора, а именно на GCC 4.9. (Инструкции по этому поводу находятся в этом вопросе.)

Если вы столкнулись с этой проблемой в Windows, там тоже есть варианты. На момент написания статьи MSYS2 по умолчанию предлагает GCC 5.2, а TDM-GCC предлагает GCC 5.1.

person CodeMouse92    schedule 06.11.2015
comment
@SergeyA: создание базы знаний является заявленной целью Stackoverflow. Вся система подсчета очков — это просто побочный эффект. - person Christian Hackl; 06.11.2015
comment
@SergeyA: Что вы имеете в виду, если это продвигается? Его продвигают, и в этом нет ничего нового. Stackoverflow еще предстоит превратиться в Facebook, и некоторые замечательные ответы здесь — это самостоятельные ответы. Так в чем проблема? - person Christian Hackl; 06.11.2015
comment
Я добавлю здесь, что я поделился информацией только потому, что это плохо документировано (поскольку это так очевидно для более опытных программистов), поэтому, пока кто-то не узнает о версиях компилятора, обладающих этим эффектом, для них это полная загадка. Теперь Google даст ответ довольно быстро. StackOverfow занимает более высокое место в результатах поиска, чем блоги, поэтому всем будет лучше разместить его здесь. - person CodeMouse92; 06.11.2015
comment
@SergeyA: Ну, я бы не знал точного ответа. И вопрос, и ответ хорошо проработаны, подкреплены ссылками и написаны читабельно и понятно. Мне кажется, это прекрасный пример хорошего самоответа. Я думаю, что было бы несправедливо сокращать ответ до VLA, поддерживающего поддержку некоторых вариантов gcc, а некоторые нет или до разных вариантов Ubuntu, поставляемых с разными компиляторами. Ответ гораздо более всеобъемлющий, чем этот. - person Christian Hackl; 06.11.2015