Какие функции 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.
Ответы
Ответ 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 сегодня, - это то, что вы получите отсюда.