Какому компилятору я должен доверять?

Это будет вопрос о новичке, но я пытался работать над небольшим упражнением на языке C (а не на С++), и у меня возникали некоторые проблемы.

Скажем, я хотел использовать массив внутри метода, размер которого зависел от одного из аргументов:

void someFunc(int arSize)
{
    char charArray[arSize];
    // DO STUFF
    ...
}

Когда я пытаюсь скомпилировать это как файл .c в Visual Studio 2013, я получаю сообщение о том, что размер непостоянного массива не разрешен. Однако тот же код работает в CodeBlocks под компилятором GNU. К чему я должен доверять? Это нормально для компиляторов вести себя по-другому? Я всегда думал, что если вы делаете то, что не нравится компилятору, вы не должны делать это в первую очередь, потому что это не стандарт.

Любой ввод полезен! Я исхожу из фона в Python, и я пытаюсь более активно участвовать в программировании с помощью Data-Structures and Algorithms.

Моя платформа - это Windows, как вы, вероятно, можете сказать. Пожалуйста, дайте мне знать, если этот вопрос нуждается в дополнительной информации, прежде чем можно будет ответить.

Ответы

Ответ 1

Массивы переменной длины (VLA) - это функция C99 и Visual Studio до недавнего времени не поддержка C99, и я не уверен, поддерживает ли она в настоящее время VLA в последней версии. gcc, с другой стороны, поддерживает C99, хотя не полностью. gcc поддерживает VLA как расширение вне режима C99, даже в С++.

Из черновик стандарта C99 раздел 6.7.5.2 Декларации массива, пункт 4:

[...] Если размер представляет собой целочисленное константное выражение, а тип элемента имеет известный постоянный размер, тип массива не является массивом переменной длины; в противном случае тип массива - это тип массива переменной длины.

Ответ 2

Это зависит от конкретного стандарта, который выполняет ваш компилятор C.

Функция, которую вы хотите, называется массив переменной длины (VLA) и была введена в C99.

Возможно, ваша Visual Studio поддерживает более раннюю версию стандарта. Возможно, вы можете настроить его для поддержки более поздней версии.

Обратите внимание, что использование VLA с огромным размером может быть плохой привычкой: VLA обычно распределяются по стеклу, а стек кадра вызова обычно должен иметь небольшой размер (всего несколько килобайт на текущих процессорах), особенно для кода ядра или для рекурсивных или многопоточных функций. Вы можете захотеть присвоить (например, calloc) массив, если он содержит более тысячи слов. Затем вам понадобится free позже.

Ответ 3

Вам следует доверять компиляторам, которые вы используете, и которые вы хотите поддерживать.

В этой конкретной проблеме: размеры неконстантных массивов действительны на C99, который не поддерживается полностью либо gcc, либо MSVC (компилятор Microsoft C/С++). gcc, однако, имеет эту функцию из стандарта, реализованного даже вне режима C99, в то время как MSVC не имеет.