Какому компилятору я должен доверять?
Это будет вопрос о новичке, но я пытался работать над небольшим упражнением на языке 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 не имеет.
Ответ 4
Это расширение GCC, действующее на вас.