Я недавно нашел интересное поведение g ++ по сравнению с MSVC ++ 2008. Рассмотрите эту крошечную программу:
#include <cstdlib>
const int ARR_LENGTH = 512;
void doSomething( int iLen );
int main( int argc, char** argv )
{
doSomething( ARR_LENGTH );
return 0;
}
void doSomething( int iLen )
{
int iTest[iLen];
return;
}
Это скомпилирует? Что Вы думаете? Согласно моему знанию C (или C++ в этом отношении), это не должно компилировать, так как я могу вызвать функцию doSomething () с любым целым числом, которое я хочу, таким образом, размер массива iTest не может быть определен во время компиляции. Однако, когда я пытаюсь скомпилировать это с g ++, он работает просто великолепно. Теперь я могу понять то, что, вероятно, произошло здесь - компилятор заметил, что я вызываю эту функцию только однажды передача времени компиляции, постоянного в качестве параметра. Некоторая серьезная оптимизация, продолжающаяся здесь... Но когда я пытаюсь скомпилировать это использование MSVC ++ 2008, я получаю это:
1>c:\prj\test\test.cpp(15) : error C2057: expected constant expression
1>c:\prj\test\test.cpp(15) : error C2466: cannot allocate an array of constant size 0
1>c:\prj\test\test.cpp(15) : error C2133: 'iTest' : unknown size
Мой вопрос: как это выполняет определение языка (стандарт C (стандарт C++))? Это очень хорошо для g ++, чтобы сделать такую оптимизацию (который в этом случае легко видеть, но в первый раз я встретился с ним, это было в крупном проекте, и это не имело большого смысла на первый взгляд).
C99 (последняя версия стандарта C) позволяет динамически изменять размеры массивов. Однако эта возможность не поддерживается Visual Studio (которая реализует только поддержку C89)
В C++ она не действует и, вероятно, никогда не будет действовать.
Это не стандартный C ++ (а стандартный C). Реализации могут предоставлять alloca (или _alloca с msvc), которая в значительной степени выполняет свою работу.
Массивы динамического размера являются особенностью C99. Если ваш компилятор поддерживает C99 (GCC поддерживает, VC не полностью) - и если вы бросите переключатель C99 - то это будет компилироваться.