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

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

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

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

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

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

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

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

Из проекта стандартного раздела C99 6.7.5.2 Объявление декларатора массива, пункт 4 :

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

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

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

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

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

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

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

Это расширение GCC, действующее на вас.

  • javascript - Разница между массивом и массивом
  • Получите первые N элементов массива?
  • Как сгладить массив в jQuery?
  • Как использовать realloc в функции в C
  • Можно ли рассматривать 2D-массив как непрерывный массив 1D?
  • Подпрограмма Fortran возвращает неправильные значения
  • Проверить строку для палиндрома
  • Являются ли массивы переданы по значению или переданы по ссылке в Java?
  • Java-массивы печатают странные цифры и текст
  • Доступ к элементам элементов в JSONArray с помощью Java
  • «Int size = 10;» дает постоянное выражение?
  • Давайте будем гением компьютера.