Подтвердить что ты не робот

Какие функции C99 доступны в компиляторе MS Visual Studio?

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

Однако компилятор включает в себя некоторые вишневые элементы, такие как переменные макросы и long long - см. цитаты в этом ответе:

В тех случаях, когда мы получили множество запросов для некоторых функций C99, мы пытались их реализовать (или аналоги). Пара примеров - это переменные макросы, 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.

4b9b3361

Ответ 1

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

  • Тип _Bool.
  • Составные литералы.
  • Назначенные инициализаторы.
  • Смешивание объявлений с кодом.
  • __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).

Ответ 2

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

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

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

Но кажется, что функции языка, которые вы видите на C с MSVC сегодня, - это то, что вы получите отсюда.