Компиляторы GNU и Visual Studio для массивов, выделенных с постоянной длины с областью действия
Я знаю, что если вы установите динамическое значение в c / c ++, вы не сможете использовать это значение в скобках для выделения массива (что сделало бы его так называемым массивом переменной длины (VLA), которыйтекущий стандарт C ++ не поддерживает)...
то есть см .:
C ++: массив переменной длины
http://en.wikipedia.org/wiki/Variable-length_array
То, что я не совсем понимаю (и то, что я не видел, спрашивается именно здесь), это то, почему GNU c / c ++ компиляторы (gcc
, g++
) все в порядке с использованием динамического выделения, основанного на целочисленном значении (насколько я могу судить), при условии, что это значение является константой в пределах области распределения лучей, ноVisual Studio
s не поддерживает это и откажется компилировать код, выплевывая ошибки.
например вg++
void Foo(const unsigned int bar)
{
double myStuff[bar];
//... do stuff...
}
... компилируется просто отлично ...
Но тот же код отказывается компилироваться в версиях VS, которые я использовал, если только я не передам строкуconst
во всех сферах или является#define
, static const
, и т.д.
Я подозреваю, что, возможно, компиляторы GNU используют область видимости, чтобы сделать вывод, что это значение является константой в этой области видимости, и либо просто присвоить ее malloc, либо обработать ее каким-то образом.
Мои вопросы:
Кто (VS или GNU) ближе к стандарту с точки зрения того, как они справляются с этим?Есть ли способ сделать это с помощью VS[]
на значение, которое постоянно в рамках, но не глобальноconst
на протяжении всей программы безmalloc
вызов?Есть ли какие-либо проблемы, о которых мне следует знать, если я использую это в своем скомпилированном GNU-коде?