Conformidad del lenguaje Microsoft C/C++ por versión de Visual Studio
Artículo
Actualmente, se sigue trabajando en la conformidad con los estándares del compilador de Microsoft C/C++ en Visual Studio (MSVC). Este es un resumen del estándar ISO del lenguaje C y C++ y la conformidad de la biblioteca de la versión de Visual Studio. El nombre de cada una de las características del compilador de C++ y de la biblioteca estándar tiene un vínculo al documento de propuesta del estándar ISO para C++ que describe la característica cuando hay alguno disponible en el momento de la publicación. La columna Compatible muestra la versión de Visual Studio en la que aparece por primera vez la compatibilidad de la característica.
VS 2019 16.5. Para ofrecer una mejor compatibilidad con versiones anteriores, __VA_OPT__ está habilitado en /Zc:preprocessor en todas las versiones lingüísticas.
Un grupo de artículos enumerados juntos indica una característica estándar junto con una o varias mejoras o expansiones aprobadas. Estas características se implementan juntas.
Características de la biblioteca estándar de C
Característica
Compatible
Características de la biblioteca estándar de C99
Compatible
Macros de ortografía alternativas <iso646.h>
VS 2015
Compatibilidad con caracteres anchos <wchar.h> y <wctype.h>
No Todavía no se ha implementado. Parcial La implementación está incompleta. Para más información, vea la sección Notas. VS 2010 Compatible con Visual Studio 2010. VS 2013 Compatible con Visual Studio 2013. VS 2015 Compatible con Visual Studio 2015 (RTW). VS 2015.2 y VS 2015.3 indican las características que se admiten en Visual Studio 2015 Update 2 y Visual Studio 2015 Update 3, respectivamente. VS 2017 15.0 Compatible con Visual Studio 2017, versión 15.0 (RTW). VS 2017 15.3 Compatible con Visual Studio 2017, versión 15.3. VS 2017 15.5 Compatible con Visual Studio 2017, versión 15.5. VS 2017 15.7 Compatible con Visual Studio 2017, versión 15.7. VS 2019 16.0 Compatible con Visual Studio 2019, versión 16.0 (RTW). VS 2019 16.1 Compatible con Visual Studio 2019, versión 16.1. VS 2019 16.2 Compatible con Visual Studio 2019, versión 16.2. VS 2019 16.3 Compatible con Visual Studio 2019, versión 16.3. VS 2019 16.4 Compatible con Visual Studio 2019, versión 16.4. VS 2019 16.5 Compatible con Visual Studio 2019, versión 16.5. VS 2019 16.6 Compatible con Visual Studio 2019, versión 16.6. VS 2019 16.7 Compatible con Visual Studio 2019, versión 16.7. VS 2019 16.8 Compatible con Visual Studio 2019, versión 16.8. VS 2019 16.9 Compatible con Visual Studio 2019, versión 16.9. VS 2019 16.10 Compatible con Visual Studio 2019, versión 16.10.\ VS 2022 17.0 Compatible con Visual Studio 2022, versión 17.0. VS 2022 17.1 Compatible con Visual Studio 2022, versión 17.1. VS 2022 17.2 Compatible con Visual Studio 2022, versión 17.2. VS 2022 17.3 Compatible con Visual Studio 2022, versión 17.3. VS 2022 17.4 Compatible con Visual Studio 2022, versión 17.4. VS 2022 17.5 Compatible con Visual Studio 2022, versión 17.5.
Notas
A En el modo /std:c++14, las especificaciones de excepción dinámicas permanecen sin implementar y throw() se sigue tratando como un sinónimo de __declspec(nothrow). En C++ 17, las especificaciones de excepción dinámicas se quitaron principalmente por P0003R5, excepto por un vestigio: throw() está en desuso y se debe comportar como un sinónimo de noexcept. En el modo /std:c++17, MSVC ahora se ajusta al Estándar al otorgar a throw() el mismo comportamiento que noexcept, es decir, cumplimiento mediante la terminación.
La opción del compilador /Zc:noexceptTypes solicita el comportamiento anterior de __declspec(nothrow). Es probable que throw() se elimine en una versión futura de C++. Para ayudar a migrar el código en respuesta a estos cambios en el Estándar y la implementación de Microsoft, se agregaron advertencias del compilador nuevas para problemas de especificación de excepciones en /std:c++17 y /permissive-.
C A partir de la versión 16.6 de Visual Studio 2019, el compilador implementa completamente el preprocesador C99 estándar a través de la opción /Zc:preprocessor. (En las versiones de la 15.8 a la 16.5 de Visual Studio 2017, el compilador admite el preprocesador C99 estándar mediante la opción del compilador /experimental:preprocessor). Esta opción está activada de forma predeterminada cuando se especifica la opción del compilador /std:c11 o /std:c17.
G Compatible con /std:c++14 con una advertencia que se puede suprimir, C4984.
E La implementación es suficiente para admitir la biblioteca del estándar C++20. Una implementación completa requiere un cambio importante del archivo binario.
F Características eliminadas cuando se especifica la opción /std:c++17 o posterior del compilador. Para volver a habilitar estas características, para facilitar la transición a los modos de lenguaje más recientes, use estas macros: _HAS_AUTO_PTR_ETC, _HAS_FUNCTION_ALLOCATOR_SUPPORT, _HAS_OLD_IOSTREAMS_MEMBERS y _HAS_UNEXPECTED.
G La biblioteca de algoritmos paralelos de ++17 está completa. Que esté completa no significa que todos los algoritmos se paralelicen en todos los casos. Los algoritmos más importantes se paralelizaron. Se proporcionan firmas de directiva de ejecución incluso cuando la implementación no paraleliza los algoritmos. El encabezado interno central, <yvals_core.h>, contiene la sección "Notas de algoritmos paralelos" siguiente: C++ permite a una implementación implementar algoritmos paralelos como llamadas a los algoritmos de serie. Esta implementación paraleliza varias llamadas de algoritmo comunes, pero no todas.
Estos algoritmos no están paralelizados actualmente:
Estos algoritmos no muestran ninguna mejora notable del rendimiento del paralelismo en el hardware de destino. Todos los algoritmos que simplemente copian o permutan elementos sin ramas suelen tener ancho de banda de memoria limitado:
H Esta es una implementación completamente nueva, incompatible con la versión anterior de std::experimental, necesaria por la compatibilidad con symlink, las correcciones de errores y los cambios en el comportamiento requerido estándar. Actualmente, <filesystem> proporciona tanto la versión nueva, std::filesystem, como la anterior, std::experimental::filesystem. El encabezado <experimental/filesystem> proporciona solo la implementación experimental anterior. Espere que la implementación experimental se quite en la próxima versión sin ABI de las bibliotecas.
I Compatible con una función intrínseca de compilador.
Jstd::byte se habilita mediante /std:c++17 o posterior, pero como en algunos casos puede entrar en conflicto con los encabezados de Windows SDK, tiene una macro de desactivación específica. Para deshabilitarlo, defina _HAS_STD_BYTE como 0.
K MSVC no admite la palabra clave _Complex ni los tipos complejos nativos. El CRT universal <complex.h> usa macros específicas de implementación para lograr el mismo efecto. Para más información, vea Compatibilidad con cálculos matemáticos complejos de C.
L El CRT universal no implementa los modificadores de conversión alternativos strftimeE y O. Estos modificadores se omiten (por ejemplo, %Oe se comporta igual que %e). Las API de configuración regional subyacentes no admiten los modificadores.
M El CTR universal no implementa C11, aligned_alloc pero proporciona _aligned_malloc y _aligned_free. Dado que el sistema operativo Windows no admite asignaciones alineadas, es poco probable que se implemente esta función.
N La declaración se quita, pero la exportación de la función permanece por compatibilidad con versiones anteriores.
O Determinadas funciones de comprobación de límites no están implementadas, tienen firmas diferentes o no forman parte del estándar C11 o C17. Estas funciones no están implementadas: abort_handler_s, ignore_handler_s, memset_s, set_constraint_handler_s, snprintf_s, snwprintf_s, strerrorlen_s y vsnwprintf_s. Estas funciones tienen firmas diferentes: gmtime_s, localtime_s, qsort_s, strtok_s, vsnprintf_s y wcstok_s. Estas funciones no aparecen en el estándar: clearerr_s y fread_s.
P Se agregó compatibilidad en la versión 16.10 de Visual Studio 2019. Se agregó compatibilidad con Clang en la versión 17.0 de Visual Studio 2022.
Q Esto quita declare_reachable, undeclare_reachable, declare_no_pointers, undeclare_no_pointers y get_pointer_safety. Anteriormente, estas funciones no tenían ningún efecto.
R Se trata de un cambio que afecta directamente al código fuente. Sin embargo, un código que antes no tenía un comportamiento definido en el tiempo de ejecución ahora se rechaza con errores del compilador.
S Se implementan adaptadores de intervalo de entrada y counted_iterator en la versión 17.0 de VS 2022. Se planea una actualización futura a la versión 16.11 de Visual Studio 2019 para incorporar estos cambios.
T<stdatomic.h> se admite actualmente al compilarse como C++ (/std:c++latest). Todavía no se admite al compilarse como C ( /std:c11 y /std:c17).
14 Estas características de C++17 y C++20 siempre están habilitadas, incluso cuando se especifica /std:c++14 (valor predeterminado). El motivo es que la característica se implementó antes de la introducción de las opciones /std , o porque la implementación condicional era compleja de una manera no deseable.
17 Estas características se habilitan mediante la opción del compilador /std:c++17 o posterior.
20 En las versiones anteriores a la versión 16.10 de Visual Studio 2019, estas características se habilitan mediante la opción /std:c++latest del compilador. En la versión 16.11 de Visual Studio 2019 se agregó la opción del compilador /std:c++20 para habilitar estas características.
20abi Debido al trabajo posterior al lanzamiento en curso en el estándar C++20, <format>, tanto las partes de formato de <chrono> (que se basan en <format>) como las fábricas de intervalos y los adaptadores de intervalo de <ranges> (todo lo que necesita el concepto view) solo están disponibles en /std:c++latest. Espere estas características en /std:c++20 después de llegar al acuerdo con WG21 de que no es necesario realizar ningún cambio importante en ABI. Las partes restantes de <chrono> y los algoritmos que se aplican a los intervalos se habilitan en la opción del compilador /std:c++20 desde la versión 16.11 de Visual Studio 2019.
23 En Visual Studio 2022, versión 17.0 y posteriores, estas características se habilitan mediante la opción /std:c++latest del compilador.
C11 La compatibilidad del compilador con C11 y C17 requiere la versión 16.8 o posterior de Visual Studio 2019. Excepto como se indicó, la compatibilidad con las bibliotecas de C11 y C17 requiere la compilación 10.0.20211.0 o posterior de Windows SDK. Para obtener más información sobre cómo instalar la compatibilidad con C11 y C17, vea Instalación de la compatibilidad con C11 y C17 en Visual Studio.
DR Estas características están habilitadas en todos los modos de opción /std del compilador de C++. El comité de estándares de C++ adoptó este cambio como un informe de defectos retroactivo en C++11 y todas las versiones posteriores.
2104 La compatibilidad de la biblioteca de C11 con esta característica requiere la compilación 10.0.20348.0 (versión 2104) o posterior de Windows SDK.