2013-09-20 5 views
2

Уроки C++, такие как this, говорят, что размер всех массивов должен быть определен заранее до запуска программы. Например, это не допускается:Trivial C++ code ... Почему это компилируется?

cout << "How many variables do you want? "; 
int nVars; 
cin >> nVars; 

int anArray[nVars]; // wrong! The size of the array must be a constant 

Но это тривиальная программа делает компилировать и выполнять хорошо. Должно ли это?

+0

Он компилируется, но (по крайней мере, на gcc 4.8) он вызывает [предупреждение] (http://coliru.stacked-crooked.com/a/2975fa20de45fe34). – JBL

ответ

6

Это распространенное расширение, реализуемое компиляторами C++, такими как g ++ GNU. Скомпилируйте флаг -std=c++0x, чтобы обработать такое объявление как ошибку.

+0

Спасибо. Так оно хранится в стеке или куче? – Kian

+1

@ user2432701 Массив находится в стеке. Компилятор играет некоторые трюки, чтобы знать размер. – dasblinkenlight

+1

@ user2432701 Они обычно реализуются в стеке, что является одной из основных причин, по которым многие [считают, что VLA являются злыми] (http://www.clarkcox.com/blog/2009/04/07/c99s-vlas-are- evil /), который аналогичен аргументу [против alloca] (http://stackoverflow.com/questions/1018853/why-is-alloca-not-considered-good-practice). –

4

Некоторые компиляторы включая поддержку gcc и clang массивы переменной длины, как расширение, даже если это действительно особенность C99.

Если вы используете -pedantic аргумент при сборке gcc или clang как даст предупреждение подобное следующему:

warning: variable length arrays are a C99 feature [-Wvla-extension] 
2

Он не должен в стандартном C++, но GCC/G ++ и (я верю) MSVC оба поддерживают расширения для таких массивов переменной длины. Есть опции, которые вы можете настроить для отключения расширений, хотя в этом случае код не будет компилироваться.

В g ++ он не сможет скомпилироваться, если вы используете -pedantic.

1

Современные компиляторы C/C++ позволяют использовать переменную для определения размера массива. Результат аналогичен использованию alloca(). Это не стандарт прямо сейчас, но gcc делает это, о другом - нужно проверить.

Смежные вопросы