Интервал C++ [n], работающий в g ++, но не с vs2008

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

...
int n;
cin >> n;
int numbers[n];
...

Это скомпилировало с NetBeans на Mac с помощью g ++ (я думаю), и это не скомпилировало использование VS2008 в Windows. Почему настолько трудно заставить его работать с каждым компилятором? Размер массива известен прежде, чем выделить его.

Править: Я знаю о std::vector. На самом деле это было частью присвоения домашней работы, и я запустил ее на работе над Mac, затем возвратился домой и был удивлен, что она не работала над VS2008. Спасибо за все ответы. Но я все еще нахожу это логичным это, если компилятор может сгенерировать некоторый код как alloc(123) где значение 123 является hardcoded, почему это не может генерировать что-то как alloc(n) где Вы добираетесь n от адреса памяти, который содержит int n или что-то. Просто кажется более логичным позволить что-то вроде этого по умолчанию.

7
задан Sai Manoj Kumar Yadlapati 25 November 2013 в 11:46
поделиться

6 ответов

Хотя размер массива известен до того, как он будет выделен, он все еще не известен до времени выполнения. Это известно как массив переменной длины (VLA) и представляет собой C99ism, поддерживаемый в g ++ расширением, которое включено по умолчанию. Чтобы быть точным, это не соответствует C ++ 98/03, и поэтому Visual C ++ имеет полное право отклонить его.

Если вы действительно хотите динамическое определение размера во время выполнения, выделите память в куче (через new []). Это будет работать везде и в качестве бонуса защитит вас от переполнения стека.

16
ответ дан 6 December 2019 в 04:55
поделиться

почему бы не использовать в cpp реальные вещи, такие как std::vector для этого

12
ответ дан 6 December 2019 в 04:55
поделиться

Нечто подобное можно сделать с помощью

 int* numbers = (int*)alloca(n * sizeof(int));  // equivalent to int numbers[n]

. Это не рекомендуемая функция, но при осторожном использовании дает точно такой же результат.

2
ответ дан 6 December 2019 в 04:55
поделиться

По книге размерность массива должна быть постоянным выражением, значение которого больше или равно единице. Постоянное выражение в смысле целочисленных буквальных констант, перечислителей или константных объектов целочисленного типа, которые сами инициализируются из константных выражений. Неконстантная переменная, значение которой неизвестно до времени выполнения, не может использоваться для указания размера массива.

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

2
ответ дан 6 December 2019 в 04:55
поделиться

Потому что размер массива должен быть постоянной времени компиляции в стандартном C ++ (см. 8.3.4 §1).

12
ответ дан 6 December 2019 в 04:55
поделиться

Поддержка VLA отсутствует в Visual Studio 2008.

1
ответ дан 6 December 2019 в 04:55
поделиться
Другие вопросы по тегам:

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