Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Работа над соблюдением стандартов для компилятора Microsoft C и C++ в Visual Studio (MSVC) еще ведется. Ниже приведена сводка по соответствию языка C и C++ и библиотеки стандарту ISO по версиям Visual Studio. Каждое название возможности компилятора C++ и стандартной библиотеки содержит ссылку на документ стандарта ISO с предложениями по C++. В этом документе находится описание возможности (если она доступна на момент публикации). В столбце поддерживаемых версий перечислены версии Visual Studio, в которых впервые появилась поддержка функции.
Дополнительные сведения об улучшениях соответствия для C++ в Visual Studio см. в этой статье. Список других изменений см. в статье "Новые возможности" для Microsoft C++ в Visual Studio. Сведения об изменениях соответствия в более ранних версиях см. в статье Критические изменения в Visual C++ и Visual C++ What's New 2003 through 2015(Новые возможности Visual C++ в версиях 2003–2015). Последние новости от команды разработчиков C++ см. в блоге команды разработчиков C++.
Note
Между версиями Visual Studio 2015, 2017, 2019 и 2022 нет критических изменений двоичного кода. Дополнительные сведения см. в статье Совместимость C++ на уровне двоичного кода между версиями Visual Studio
Функции компилятора C++
Функции стандартной библиотеки C++
Более подробный список функций стандартной библиотеки и исправлений ошибок по версиям продукта доступен на вики-странице журнала исправлений библиотеки STL от Майкрософт на сайте GitHub.
Последнюю информацию о текущей работе по соответствию смотрите в следующих статьях:
Набор совместно указанных документов указывает на стандартную функцию с одним или несколькими утвержденными улучшениями или расширениями. Эти функции реализованы вместе.
Функции стандартной библиотеки C
| Feature | Supported |
|---|---|
| Функции стандартной библиотеки C99 | Supported |
Альтернативные макросы орфографии <iso646.h> |
VS 2015 |
Поддержка расширенных символов <wchar.h> и <wctype.h> |
VS 2015 |
Сложная поддержка в <complex.h> |
Частично в VS 2015 K |
Тип универсальных математических функций <tgmath.h> |
VS 2019 16.8 2104 |
Дополнительные характеристики с плавающей запятой <float.h> |
VS 2015 |
Шестнадцатеричные описатели printf с плавающей запятой %A, %a |
VS 2015 |
Типы расширенных целых чисел <inttypes.h>, <stdint.h> |
VS 2015 |
Семейство vscanf в <stdio.h> и <wchar.h> |
VS 2015 |
Новые математические функции в <math.h> |
VS 2015 |
Обработка условий ошибки математической библиотеки (math_errhandling) |
VS 2015 |
Доступ к среде с плавающей запятой <fenv.h> |
VS 2015 |
%lfОписатель преобразования для printf |
VS 2015 |
snprintfСемейство функций в <stdio.h> |
VS 2015 |
booleanТип в <stdbool.h> |
VS 2015 |
va_copyМакрос |
VS 2015 |
Дополнительные strftime описатели преобразования |
Частично в VS 2015 L |
| Функции стандартной библиотеки C11 | Supported |
Описатели выравнивания <stdalign.h> |
VS 2019 16.8 C11, 2104 |
aligned_alloc |
Нет M |
Нет описателей возврата <stdnoreturn.h> |
VS 2019 16.8 C11, 2104 |
Поддержка потоков <threads.h> |
yes |
Атомарная поддержка <stdatomic.h> |
experimental |
char16_t, char32_t<uchar.h> |
VS 2019 16.8 C11 |
gets() удалено |
VS 2019 16.8 C11, N |
gets_s() |
VS 2019 16.8 C11 |
Интерфейсы проверки границ (*_s API) |
Частично в VS 2015 C11, O |
fopenПараметр "x" |
VS 2019 16.8 C11 |
| Статические утверждения | VS 2019 16.8 C11, 2104 |
quick_exit |
VS 2019 16.8 C11 |
<complex.h>Макросы |
VS 2019 16.8 C11 |
Характеристики с плавающей запятой <float.h> |
VS 2019 16.8 C11 |
Потоки C11 <threads.h> |
VS 2022 17.8 C11 |
Поддерживаемые значения
Нет. Еще не реализовано.
Частично. Частичная реализация. Дополнительные сведения см. в разделе Примечания.
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.
Средства сборки MSVC версии 14.50 Поддерживается в Visual Studio 2026 18.0 (компилятор MSVC версии 19.50) и более поздних версий.
Notes
В/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-.
B Поддерживается в режиме /permissive- в Visual Studio 2017 версии 15.7. Дополнительные сведения см. в разделе Two-phase name lookup support comes to MSVC.
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++ допускает реализацию параллельных алгоритмов как вызовов последовательных алгоритмов. Эта реализация распараллеливает некоторые распространенные вызовы алгоритмов, но не все.
Параллельно работают следующие алгоритмы:
-
adjacent_differenceadjacent_find,all_ofany_ofcountcount_ifequalexclusive_scanfindfind_endfind_first_offind_iffind_if_notfor_eachfor_each_ninclusive_scanis_heapis_heap_untilis_partitionedis_sortedis_sorted_untilmismatchnone_ofpartitionreduceremoveremove_ifreplacereplace_ifsearchsearch_nset_differenceset_intersectionsortstable_sorttransformtransform_exclusive_scantransform_inclusive_scantransform_reduce
Указанные ниже алгоритмы в настоящее время еще не распараллелены.
- Эти алгоритмы не показывают заметного увеличения производительности от параллелизма на целевом оборудовании. Все алгоритмы, которые просто копируют или перемутируют элементы без ветвей, обычно ограничены пропускной способностью памяти:
-
copy,copy_n,fillfill_nmovereversereverse_copyrotaterotate_copyshift_leftshift_rightswap_ranges
-
- Путаница с требованиями параллелизма пользователей существует для этих алгоритмов, которые, скорее всего, в приведенной выше категории в любом случае:
-
generate,generate_n
-
- Эффективная параллелизм этих алгоритмов может быть неубедимой:
-
partial_sort,partial_sort_copy
-
- Эти алгоритмы пока не оцениваются. Библиотека может реализовать параллелизм в следующем выпуске:
-
copy_ifincludes,inplace_mergelexicographical_comparemax_elementmergemin_elementminmax_elementnth_elementpartition_copyremove_copyremove_copy_ifreplace_copyreplace_copy_ifset_symmetric_differenceset_unionstable_partitionuniqueunique_copy
-
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).
Расширенные типы с плавающей запятой U являются необязательным компонентом C++23. Эта функция не будет реализована до тех пор, пока не будет завершена стандартизация C++23.
V Использует параметры /source-charset:utf-8 компилятора и /we4828 обрабатывает исходные файлы в кодировке UTF-8.
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.
24 В средствах сборки MSVC версии 14.50 и более поздних версий (впервые поставляется с Visual Studio 2026 версии 18.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) или более поздней версии.
См. также
Справочник по языку C++
Стандартная библиотека C++
Улучшения соответствия C++ в Visual Studio
Новые возможности Microsoft C++ в Visual Studio
Журнал изменений Visual C++ 2003–2015
Новые возможности Visual C++ 2003–2015
Блог группы разработчиков C++