Какие функции C99 доступны в компиляторе MS Visual Studio? - PullRequest
33 голосов
/ 08 марта 2012

Хорошо известно, что компилятор Microsoft Visual Studio не поддерживает C99, и похоже, что у них нет планов до поддержки .

Тем не менее, компилятор включает некоторые функции, выбранные из вишен, например, макросы с переменным числом аргументов и long long - см. Цитаты в этот ответ :

Где мыМы получили много запросов на определенные функции C99, мы пытались реализовать их (или аналоги).Примерами пар являются макросы типа variadic, long long, __pragma, __FUNCTION__ и __restrict.Если есть другие функции C99, которые вам пригодятся в вашей работе, сообщите нам!Мы мало что слышим от наших пользователей C, так что говорите и дайте себе знать

- Арджун Биджанки, представитель Microsoft в комитете по стандарту ISO C http://blogs.msdn.com/b/vcblog/archive/2007/11/05/iso-c-standard-update.aspx

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

Есть много вопросов о конкретных функциях, но я не хочу знать, что это: Где найти список функций C99, поддерживаемых / предоставляемых текущим компилятором MSVC?

Я ищу список , подобный этому для gcc .

Ответы [ 2 ]

33 голосов
/ 24 января 2015

К счастью, позиция Microsoft по этому вопросу изменилась.MSVC ++ версии 12.0 (часть Visual Studio 2013) добавлена ​​поддержка для

  • _Bool type.
  • Составные литералы.
  • Назначенные инициализаторы.
  • Смешивание объявлений с кодом.
  • __func__ предопределенный идентификатор.

Вы можете проверить макрос _MSC_VER для значений большебольше или равно 1800, чтобы увидеть, поддерживаются ли эти функции.

Поддержка стандартной библиотеки также была обновлена ​​и в основном завершена в MSVC 14.0 (Visual Studio 2015).

Вещи, которые более ранние версии уже поддерживали (я думаю, по крайней мере, начиная с MSVC 7.1 / Visual Studio 2003):

  • // комментарии в стиле.
  • long long type.
  • Гибкие члены массива (Microsoft называет их "не размерными массивами").
  • Вариативные макросы (хотя бы частично).

Вещи, которые все еще отсутствуют:

  • Массивы переменной длины (необязательно в C11).
  • Поддержкаinline ключевое слово (вы можете использовать __inline, но семантика может немного отличаться).
  • Поддержка ключевого слова restrict (вы можете использовать __restrict).
  • Типовые математические функции типа tgmath.h.
  • _Complex (необязательно в C11).
9 голосов
/ 08 марта 2012

Я считаю, что единственная небиблиотечная функция языка C99 (не в C90), поддерживаемая в MSVC, - это // комментарии. Кроме этого, при компиляции в режиме C, единственные возможности C99, которые вы получите, связаны с возможностями библиотеки C99, которые принесла Microsoft, потому что эти функции были введены в стандарт C ++ / черновой стандарт / TR, который поддерживал компилятор MS. Например, вы получили stdint.h в VS 2010, потому что это было в черновике C ++ TR1.

Microsoft ясно дала понять, что не видит сильного толчка со стороны рынка в распределении ресурсов для поддержки C99 в MSVC, поэтому почти наверняка единственные части C99, которые вы увидите в режиме компилятора C MSVC, - это те, из-за C ++.

Одна из вещей, которые I разочаровывают, заключается в том, что небиблиотечные функции языка C99, которые долгое время были частью C ++, недоступны в режиме C. Лично мне было бы очень полезно, если бы при компиляции кода C поддерживалась только способность C99 смешивать операторы с объявлениями.

Но похоже, что языковые возможности, которые вы видите в C сегодня вместе с MSVC, - вот что вы получите здесь.

...