Другое поведение компиляторов с распределением массива

Я недавно нашел интересное поведение 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 ++, чтобы сделать такую оптимизацию (который в этом случае легко видеть, но в первый раз я встретился с ним, это было в крупном проекте, и это не имело большого смысла на первый взгляд).

6
задан PeterK 22 June 2010 в 12:28
поделиться

3 ответа

C99 (последняя версия стандарта C) позволяет динамически изменять размеры массивов. Однако эта возможность не поддерживается Visual Studio (которая реализует только поддержку C89)

В C++ она не действует и, вероятно, никогда не будет действовать.

5
ответ дан 17 December 2019 в 00:03
поделиться

Это не стандартный C ++ (а стандартный C). Реализации могут предоставлять alloca (или _alloca с msvc), которая в значительной степени выполняет свою работу.

0
ответ дан 17 December 2019 в 00:03
поделиться

Массивы динамического размера являются особенностью C99. Если ваш компилятор поддерживает C99 (GCC поддерживает, VC не полностью) - и если вы бросите переключатель C99 - то это будет компилироваться.

2
ответ дан 17 December 2019 в 00:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: