C ++ int a [n] работает в g ​​++, но не с vs2008 - PullRequest
6 голосов
/ 24 июля 2010

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

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

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

РЕДАКТИРОВАТЬ: Я знаю о std::vector.На самом деле это было частью домашнего задания, и я начал его на работе на Mac, затем вернулся домой и был удивлен, что он не работает на VS2008.Спасибо за ответы на все вопросы.Но я по-прежнему считаю логичным, что если компилятор может сгенерировать некоторый код, такой как alloc(123), где значение 123 жестко закодировано, то почему он не может сгенерировать что-то вроде alloc(n), где вы получаете n из адреса памяти, который содержит int n или что-то в этом роде.Просто кажется более логичным разрешить что-то подобное по умолчанию.

Ответы [ 6 ]

16 голосов
/ 24 июля 2010

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

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

12 голосов
/ 24 июля 2010

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

12 голосов
/ 24 июля 2010

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

2 голосов
/ 24 июля 2010

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

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

2 голосов
/ 24 июля 2010

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

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

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

1 голос
/ 24 июля 2010

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

...