Недавно я нашел интересное поведение г ++ по сравнению с 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++))? Хорошо ли для g ++ делать такую оптимизацию (что в этом случае легко увидеть, но в первый раз я столкнулся с ней, это было в большом проекте, и на первый взгляд это не имело большого смысла).
Возможный дубликат [Массивы переменной длины в C++?] (Http://stackoverflow.com/questions/1887097/variable-length-arrays-in-c) –