Объявление размера массива с непостоянной переменной

Вы столкнулись с проблемой в

 s1.name="Paolo";

, потому что в LHS вы используете тип array , который не является присваиваемым .

Для разработки из C11 главы §6.5.16

оператор присваивания должен иметь изменяемое значение lvalue в качестве его левого операнда.

и относительно изменяемого lvalue , из главы §6.3.2.1

Модифицируемое lvalue является значением l, которое не имеет типа массива, [.. .]

Вам нужно использовать strcpy() для копировать в массив.

Тем не менее data s1 = {"Paolo", "Rossi", 19}; работает нормально, потому что это не является прямым назначением , связанным с оператором присваивания. Там мы используем список инициализаторов , заключенный в скобки , чтобы обеспечить начальные значения объекта . Это следует за законом инициализации, как указано в главе §6.7.9

Каждый список инициализаторов, заключенных в фигурную скобку, имеет связанный текущий объект. Когда нет обозначений, подобъекты текущего объекта инициализируются в соответствии с типом текущего объекта: элементы массива в возрастающем порядке индекса, члены структуры в порядке объявления и первый именованный член союза. [... .]

28
задан Lightness Races in Orbit 17 November 2011 в 18:00
поделиться

2 ответа

Это расширение GCC к стандарту: см. Здесь .

Вы можете использовать опцию -pedantic , чтобы GCC выдал предупреждение, или -std = c ++ 98 , чтобы сделать ошибку, когда вы используете один из этих расширения (в случае, если переносимость вызывает беспокойство).

28
ответ дан 28 November 2019 в 03:41
поделиться

Вы используете функцию из C99, которая называется VLA (массивы переменной длины). Было бы лучше, если бы вы скомпилировали вашу программу так:

g++ -Wall -std=c++98 myprog.cpp
5
ответ дан 28 November 2019 в 03:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: