Соответствие стандартам языка Microsoft C/C++ в зависимости от версии Visual Studio
Статья
Работа над соблюдением стандартов для компилятора Microsoft C и C++ в Visual Studio (MSVC) еще ведется. Ниже приведена сводка по соответствию языка C и C++ и библиотеки стандарту ISO по версиям Visual Studio. Каждое название возможности компилятора C++ и стандартной библиотеки содержит ссылку на документ стандарта ISO с предложениями по C++. В этом документе находится описание возможности (если она доступна на момент публикации). В столбце поддерживаемых версий перечислены версии Visual Studio, в которых впервые появилась поддержка функции.
Набор совместно указанных документов указывает на стандартную функцию с одним или несколькими утвержденными улучшениями или расширениями. Эти функции реализованы вместе.
Функции стандартной библиотеки C
Функция
Поддерживается
Функции стандартной библиотеки C99
Поддерживается
Альтернативные макросы орфографии <iso646.h>
VS 2015
Поддержка расширенных символов <wchar.h> и <wctype.h>
Нет. Еще не реализовано. Частично. Частичная реализация. Дополнительные сведения см. в разделе Примечания. VS 2010. Поддерживается в Visual Studio 2010. VS 2013. Поддерживается в Visual Studio 2013. VS 2015. Поддерживается в Visual Studio 2015 (RTW). VS 2015.2 и VS 2015.3 — функции, которые поддерживаются в Visual Studio 2015 с обновлением 2 и Visual Studio 2015 с обновлением 3, соответственно. VS 2017 15.0. Поддерживается в Visual Studio 2017 версии 15.0 (RTW). VS 2017 15.3. Поддерживается в Visual Studio 2017 версии 15.3. VS 2017 15.5. Поддерживается в Visual Studio 2017 версии 15.5. VS 2017 15.7. Поддерживается в Visual Studio 2017 версии 15.7. VS 2019 16.0. Поддерживается в Visual Studio 2019 версии 16.0 (RTW). VS 2019 16.1. Поддерживается в Visual Studio 2019 версии 16.1. VS 2019 16.2. Поддерживается в Visual Studio 2019 версии 16.2. VS 2019 16.3. Поддерживается в Visual Studio 2019 версии 16.3. VS 2019 16.4. Поддерживается в Visual Studio 2019 версии 16.4. VS 2019 16.5. Поддерживается в Visual Studio 2019 версии 16.5. VS 2019 16.6. Поддерживается в Visual Studio 2019 версии 16.6. VS 2019 16.7. Поддерживается в Visual Studio 2019 версии 16.7. VS 2019 16.8. Поддерживается в Visual Studio 2019 версии 16.8. VS 2019 16.9. Поддерживается в Visual Studio 2019 версии 16.9. VS 2019 16.10. Поддерживается в Visual Studio 2019 версии 16.10.\ VS 2022 17.0. Поддерживается в Visual Studio 2022 версии 17.0. Vs 2022 17.1 поддерживается в Visual Studio 2022 версии 17.1. Vs 2022 17.2 поддерживается в Visual Studio 2022 версии 17.2. VS 2022 17.3 поддерживается в Visual Studio 2022 версии 17.3. VS 2022 17.4 поддерживается в Visual Studio 2022 версии 17.4. VS 2022 17.5 поддерживается в Visual Studio 2022 версии 17.5.
Примечания.
A В режиме /std:c++14 спецификации динамических исключений остаются нереализованными, и throw() по-прежнему рассматривается как синоним __declspec(nothrow). В C++17 динамические спецификации исключений в основном удалены в соответствии с P0003R5, за исключением одного компонента (throw()), который является устаревшим и должен вести себя как аналог noexcept. В режиме /std:c++17 параметры MSVC теперь соответствуют стандарту, обеспечивая throw() то же поведение, что и noexcept, т. е. через завершение.
Параметр компилятора /Zc:noexceptTypes запрашивает старое поведение __declspec(nothrow). Скорее всего, элемент throw() будет удален в будущей версии C++. Чтобы помочь при переносе кода в ответ на эти изменения в стандартной и реализации Майкрософт, добавляются /std:c++17 новые предупреждения компилятора для проблем спецификации исключений и /permissive-.
C В Visual Studio 2019 версии 16.6 и более поздних версиях компилятор полностью реализует стандартный препроцессор C99 с помощью /Zc:preprocessor параметра. (В Visual Studio 2017 версий 15.8–16.5 компилятор поддерживает препроцессор стандарта C99 с помощью параметра /experimental:preprocessor.) Этот параметр включен по умолчанию, если указан параметр компилятора /std:c11 или /std:c17.
D Поддерживается в /std:c++14 с подавляемым предупреждением C4984.
E Реализация является достаточной для поддержки стандартной библиотеки C++20. Для полной реализации требуется двоичное критическое изменение.
F Функции удаляются, если указан параметр компилятора /std:c++17 (или более поздней версии). Чтобы снова включить эти функции (для упрощения перехода к новым языковым режимам), используйте следующие макросы: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS и _HAS_UNEXPECTED.
G Разработка библиотек для параллельных алгоритмов C++17 завершена. Это не значит, что каждый алгоритм работает параллельно в каждом случае. Параллелизуются наиболее важные алгоритмы. Сигнатуры политик выполнения предоставляются даже тогда, когда алгоритмы в реализации не параллелизуются. Центральный заголовок (<yvals_core.h>) содержит следующие "замечания по параллельным алгоритмам": C++ допускает реализацию параллельных алгоритмов как вызовов последовательных алгоритмов. Эта реализация распараллеливает некоторые распространенные вызовы алгоритмов, но не все.
Указанные ниже алгоритмы в настоящее время еще не распараллелены.
Эти алгоритмы не показывают заметного увеличения производительности от параллелизма на целевом оборудовании. Все алгоритмы, которые просто копируют или перемутируют элементы без ветвей, обычно ограничены пропускной способностью памяти:
H Это совершенно новая, несовместимая с предыдущей версией std::experimental реализация, необходимость в которой вызвана добавлением поддержки символьных ссылок, исправлением ошибок и изменениями в поведении, которое требуется для соблюдения стандарта. В настоящее время <filesystem> предоставляет и новый элемент std::filesystem, и предыдущий элемент std::experimental::filesystem. Заголовок <experimental/filesystem> предоставляет только старую экспериментальную реализацию. Ожидается, что экспериментальная реализация будет удалена в следующем выпуске библиотек, содержащем критические изменения в ABI.
I Поддерживается встроенными функциями компилятора.
Jstd::byte поддерживается /std:c++17 (или более поздней версией), но так как в некоторых случаях эта версия может конфликтовать с заголовками Windows SDK, предусмотрен детально настроенный макрос явного отказа. Чтобы отключить его, определите _HAS_STD_BYTE как 0.
K MSVC не поддерживает ключевое слово _Complex или собственные сложные типы. <complex.h> универсальной библиотеки CRT использует макросы, зависящие от реализации, для достижения того же результата. Дополнительные сведения см. в статье о поддержке сложных математических функций в C.
L Универсальная библиотека CRT не реализует альтернативные модификаторы преобразования strftimeE и O. Эти модификаторы не учитываются (например, %Oe действует так же, как %e). Модификаторы не поддерживаются базовыми локальными API.
M Универсальная библиотека CRT не реализует C11 aligned_alloc, но предоставляет _aligned_malloc и _aligned_free. Маловероятно, что эта функция вряд ли будет реализована, так как операционная система Windows не поддерживает выровненные распределения.
N Объявление удаляется, но экспорт для функции остается для обратной совместимости.
O Некоторые функции проверки границ не реализованы, имеют разные сигнатуры или не являются частью стандарта C11 или C17. Следующие функции не реализованы: abort_handler_s, ignore_handler_s, memset_s, set_constraint_handler_s, snprintf_s, snwprintf_s, strerrorlen_s, vsnwprintf_s. Следующие функции имеют разные сигнатуры: gmtime_s, localtime_s, qsort_s, strtok_s, vsnprintf_s, wcstok_s. Следующие функции не отображаются в стандартной версии: clearerr_s, fread_s.
P Поддержка добавлена в Visual Studio 2019 версии 16.10. Поддержка Clang была добавлена в Visual Studio 2022 версии 17.0.
Q Это приведет к удалению declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers и get_pointer_safety. Ранее эти функции не действовали.
R Это частое критическое изменение исходного кода. Несмотря на это, код с ранее неопределенным поведением в среде выполнения теперь отклоняется с ошибками компилятора.
S Адаптеры диапазона ввода и counted_iterator реализованы в VS 2022 17.0. Мы планируем включить эти изменения в будущее обновление до Visual Studio 2019 версии 16.11.
T<stdatomic.h> в настоящее время поддерживается при компиляции как C++ (/std:c++latest). Он пока не поддерживается при компиляции как C (/std:c11 и /std:c17).
14 Эти функции C++17 и C++20 всегда включены, даже если указано значение по умолчанию /std:c++14. Это происходит, потому что функция реализована до введения параметров /std или из-за сложных условий реализации.
17 Эти функции реализуются с помощью параметра компилятора /std:c++17 или более поздней версии.
20 В версиях до Visual Studio 2019 версии 16.10 эти функции включены с помощью параметра компилятора /std:c++latest. В Visual Studio 2019 версии 16.11 добавлен параметр компилятора /std:c++20 для включения этих функций.
20abi Из-за непрерывной работы после выпуска над стандартом C++20, <format>, части форматирования <chrono> (которые используют <format>), а также фабрики и адаптеры диапазонов из <ranges> (все, что использует концепцию view) доступны только в /std:c++latest. Ожидается, что эти функции станут доступными в /std:c++20, когда мы согласуем с WG21, что дальнейшие критические изменения в ABI не требуются. Остальные части <chrono> и алгоритмы, применяемые к диапазонам, включены в параметре компилятора /std:c++20 в Visual Studio 2019 версии 16.11 и более поздних версий.
23 В Visual Studio 2022 версии 17.0 и более поздних эти функции включаются с помощью параметра компилятора /std:c++latest.
C11 Для поддержки C11 и C17 компилятором требуется Visual Studio 2019 версии 16.8 или более поздней. За исключением указанных случаев, для поддержки библиотеки C11 и C17 требуется Windows SDK сборки 10.0.20211.0 или более поздней версии. Дополнительные сведения об установке поддержки для C11 и C17 в Visual Studio см. в этой статье.
DR Эти функции реализуются во всех режимах параметра компилятора C++ /std. Комитет по стандартизации C++ применил это изменение в C++11 и в более поздних версиях в виде отчета об ошибках, имеющего обратное действие.
2104 Для поддержки библиотеки C11 для этой функции требуется Windows SDK сборки 10.0.20348.0 (версия 2104) или более поздней версии.