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

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

  • Любой более быстрый способ копирования массивов в C #?
  • Передача 2D-массива функции C ++
  • Указатель на 2d-массив
  • Проверьте, существует ли значение в массиве
  • Добавить новый элемент в массив без указания индекса в Bash
  • Как resize многомерного (2D) массива в C #?
  • Как объявить двухмерный массив типа string в Objective-C?
  • Является ли массив примитивным типом или объектом (или чем-то еще полностью)?
  • Многомерные массивы в Swift
  • Сравнение массивов в утверждениях JUnit, сжатый встроенный способ?
  • Почему новые методы java.util.Arrays в Java 8 не перегружены для всех примитивных типов?
  • Interesting Posts

    Есть ли альтернатива JPasswordField?

    Какова цель субдомена WWW?

    Зачем использовать общий объем использования ресурсов монитора и диспетчера задач даже при удаленном добавлении к общей физической памяти?

    Работа с запятыми в файле CSV

    Циркулярная ссылка обнаружила исключение при сериализации объекта в JSON

    Как изменить формат данных в формате long?

    Сценарий Bash & 'su', дающий ошибку «стандарт должен быть tty»,

    Почему каждый выбирает JSON Over XML для jQuery?

    «Этот файл был создан из интернет-сайта» – Как отметить этот файл как локальный и безопасный?

    Как использовать Simple HTTP-клиент в Android?

    Gparted: во время изменения раздела изменился раздел NTFS, как я могу его восстановить?

    Android с длинным касанием

    использование статических библиотек вместо динамических библиотек в opencv

    Переопределение admin css в django

    Добавление загрузочного раздела на внешний жесткий диск

    Давайте будем гением компьютера.