Conformidad del lenguaje Microsoft C/C++ por versión de Visual Studio
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 vincula al documento de propuesta del estándar ISO para C++ que describe la característica, si hubiera 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.
Para más información sobre las mejoras de conformidad, vea Mejoras de conformidad de C++ en Visual Studio. Para obtener una lista de otros cambios, consulte Novedades de C++ en Visual Studio. Para conocer los cambios de conformidad en versiones anteriores, consulte Historial de cambios en Visual C++ 2003-2015 y Novedades de Visual C++ de 2003 a 2015. Para mantenerse al tanto de las noticias actuales del equipo de C++, visite el blog del equipo de C++.
Nota
No existen cambios importantes binarios entre Visual Studio 2015, 2017, 2019 y 2022. Para obtener más información, consulte Compatibilidad binaria de C++ entre versiones de Visual Studio.
Características del compilador de C++
Características de la biblioteca estándar de C++
Puede encontrar una lista más detallada de las características de la biblioteca estándar y las correcciones de errores por versión del producto en la página del registro de cambios de la wiki de STL de Microsoft en GitHub.
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> |
VS 2015 |
Compatibilidad compleja en <complex.h> |
Parcial en VS 2015 K |
Funciones matemáticas de tipo genérico <tgmath.h> |
VS 2019 16.8 2104 |
Características de punto flotante adicionales <float.h> |
VS 2015 |
Especificadores de printf float %A hexadecimales , %a |
VS 2015 |
Tipos de enteros extendidos <inttypes.h> , <stdint.h> |
VS 2015 |
vscanfFamilia de en <stdio.h> y <wchar.h> |
VS 2015 |
Nuevas funciones matemáticas en <math.h> |
VS 2015 |
Tratamiento de las condiciones de error de la biblioteca matemática (math_errhandling) |
VS 2015 |
Acceso al entorno de punto flotante <fenv.h> |
VS 2015 |
%lfEspecificador de conversión para printf |
VS 2015 |
snprintfFamilia de funciones en <stdio.h> |
VS 2015 |
booleanTipo en <stdbool.h> |
VS 2015 |
va_copyMacro |
VS 2015 |
Especificadores de conversión strftime adicionales |
Parcial en VS 2015 L |
| Características de la biblioteca estándar de C11 | Compatible |
Especificadores de alineación <stdalign.h> |
VS 2019 16.8 C11, 2104 |
aligned_alloc |
No M |
Sin especificadores de devolución <stdnoreturn.h> |
VS 2019 16.8 C11, 2104 |
Compatibilidad con subprocesamiento <threads.h> |
No |
Compatibilidad con Atomic <stdatomic.h> |
No |
char16_t, char32_t<uchar.h> |
VS 2019 16.8 C11 |
se quitó gets() |
VS 2019 16.8 C11, N |
gets_s() |
VS 2019 16.8 C11 |
Interfaces de comprobación de límites (API *_s) |
Parcial en VS 2015 C11, O |
fopenOpción "x" |
VS 2019 16.8 C11 |
| Aserciones estáticas | VS 2019 16.8 C11, 2104 |
quick_exit |
VS 2019 16.8 C11 |
<complex.h> macros |
VS 2019 16.8 C11 |
Características de punto flotante <float.h> |
VS 2019 16.8 C11 |
Valores admitidos
No Aún no se ha implementado.
Parcial La implementación está incompleta. Para más información, consulte la sección Notas.
VS 2010 Compatible con Visual Studio 2010.
VS 2013 Se admite en Visual Studio 2013.
VS 2015 Compatible con Visual Studio 2015 (RTW).
VS 2015.2 y VS 2015.3 indican 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 versión 15.0 (RTW) de 2017.
VS 2017 15.3 Compatible con Visual Studio versión 15.3 de 2017.
VS 2017 15.5 Compatible con Visual Studio versión 15.5 de 2017.
VS 2017 15.7 Compatible con Visual Studio versión 15.7 de 2017.
VS 2019 16.0 Compatible con Visual Studio versión 16.0 (RTW) de 2019.
VS 2019 16.1 Compatible con Visual Studio versión 16.1 de 2019.
VS 2019 16.2 Compatible con Visual Studio versión 16.2 de 2019.
VS 2019 16.3 Compatible con Visual Studio versión 16.3 de 2019.
VS 2019 16.4 Compatible con Visual Studio versión 16.4 de 2019.
VS 2019 16.5 Compatible con Visual Studio versión 16.5 de 2019.
VS 2019 16.6 Compatible con Visual Studio versión 16.6 de 2019.
VS 2019 16.7 Compatible con Visual Studio versión 16.7 de 2019.
VS 2019 16.8 Compatible con Visual Studio versión 16.8 de 2019.
VS 2019 16.9 Compatible con Visual Studio versión 16.9 de 2019.
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.
Notas
modo , las especificaciones de excepciones dinámicas permanecen sin implementar y se siguen tratando /std:c++14throw() como sinónimos de __declspec(nothrow) . En C++ 17, las especificaciones de excepción dinámicas se quitaron principalmente por P0003R5, dejando 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, se agregaron advertencias del compilador nuevas para problemas de especificación de excepciones en /std:c++17 y /permissive-.
Compatible en /permissive- modo en Visual Studio versión 15.7 de 2017. Para más información, consulte La compatibilidad con la búsqueda de nombres en dos fases llega a MSVC.
A partir Visual Studio versión 16.6 de 2019, el compilador implementa completamente el preprocesador C99 mediante la /Zc:preprocessor opción . (Antes de la versión 16.6, a partir de la versión 15.8 de Visual Studio 2017, el compilador proporciona compatibilidad con el preprocesador C99 mediante la opción del /experimental:preprocessor compilador). Esta opción está activa de forma predeterminada cuando se especifica /std:c11 la opción del compilador o /std:c17 .
Se admite en /std:c++14 con una advertencia supresible, C4984 .
La implementación es suficiente para admitir la biblioteca estándar de C++20. Una implementación completa requiere un cambio importante del archivo binario.
Características quitadas cuando se especifica la opción del /std:c++17 compilador o posterior. 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.
biblioteca de algoritmos paralelos de G C++17 está completa. Que esté completa no significa que todos los algoritmos se paralelicen en todos los casos. Los algoritmos más importantes se han paralelizado, y se proporcionan firmas de la directiva de ejecución incluso cuando no se paralelizan los algoritmos. El encabezado interno central de nuestra implementación, yvals_core.h , contiene las siguientes "Notas de algoritmos paralelos": C++ permite que una implementación implemente algoritmos paralelos como llamadas a los algoritmos <> serie. Esta implementación paraleliza varias llamadas de algoritmo comunes, pero no todas.
Se paralelizan los algoritmos siguientes:
adjacent_difference,adjacent_find,all_of,any_of,count,count_if,equal,exclusive_scan,find,find_end,find_first_of,find_if,find_if_not,for_each,for_each_n,inclusive_scan,is_heap,is_heap_until,is_partitioned,is_sorted,is_sorted_until,mismatch,none_of,partition,reduce,remove,remove_if,replace,replace_if,search,search_n,set_difference,set_intersection,sort,stable_sort,transform,transform_exclusive_scan,transform_inclusive_scan,transform_reduce
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:
copy,copy_n,fill,fill_n,move,reverse,reverse_copy,rotate,rotate_copy,shift_left,shift_right,swap_ranges
- Existe confusión sobre los requisitos de paralelismo de usuario para estos algoritmos, que es probable que estén al menos en la categoría anterior:
generate,generate_n
- El paralelismo efectivo de estos algoritmos puede ser inviable:
partial_sort,partial_sort_copy
- Estos algoritmos aún no se han evaluado. Podemos implementar el paralelismo en una versión futura:
copy_if,includes,inplace_merge,lexicographical_compare,max_element,merge,min_element,minmax_element,nth_element,partition_copy,remove_copy,remove_copy_if,replace_copy,replace_copy_if,set_symmetric_difference,set_union,stable_partition,unique,unique_copy
Se trata de una implementación totalmente nueva, incompatible con la versión anterior, necesaria por compatibilidad con symlink, correcciones de errores y cambios en el comportamiento requerido std::experimental 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. La implementación experimental se quitará en la próxima versión sin ABI de las bibliotecas.
sido compatible con un intrínseco del compilador.
está habilitado por o versiones posteriores, pero como puede estar en conflicto con los encabezados del SDK de Windows en algunos casos, tiene una macro de exclusión std::byte/std:c++17 detallada. Para deshabilitarlo, defina _HAS_STD_BYTE como 0.
MSVC no admite la palabra _Complex clave 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.
Crt universal no implementa los modificadores de strftimeEO conversión alternativos y . Estos modificadores se omiten (por ejemplo, %Oe se comporta igual que %e). Las API de configuración regional subyacentes no admiten los modificadores.
Crt universal no implementa C11, aligned_alloc pero proporciona y _aligned_malloc_aligned_free . Dado que el sistema operativo Windows no admite asignaciones alineadas, es poco probable que se implemente esta función.
La declaración se quita, pero la exportación de la función permanece por compatibilidad con versiones anteriores.
funciones de comprobación de límites no estánimplementadas, 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.
agregó compatibilidad con P en VS 2019 16.10. La compatibilidad con Clang se agregó en VS 2022 17.0.
quita declare_reachable , , , , undeclare_reachabledeclare_no_pointersundeclare_no_pointersget_pointer_safety . Anteriormente, estas funciones no tenían ningún efecto.
trata de un cambio importante de origen común. Sin embargo, un código que antes no tenía un comportamiento definido en el tiempo de ejecución ahora se rechazará con errores del compilador.
La parte está implementada; la parte de adaptadores de intervalo de entrada counted_iterator aún no se ha implementado.
<stdatomic.h> se admite T al compilar como C++ ( /std:c++latest ). Todavía no se admite al compilarse como C ( /std:c11 y /std:c17)
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.
Estas características están habilitadas por la /std:c++17 opción del compilador o posterior.
En versiones hasta Visual Studio versión 16.10 de 2019, estas características se habilitan mediante la /std:c++latest opción 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.
Debido al trabajo posterior al lanzamiento en curso en el estándar C++20, , las partes de formato de (que se basan en ) y los generadores de intervalos y los adaptadores de intervalo de (todo lo que necesita el <format><chrono><format><ranges>view concepto) solo están disponibles en /std:c++latest . Estas características estarán disponibles en /std:c++20 después de llegar al acuerdo con WG21 de que no es necesario realizar más cambios importantes 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.
En Visual Studio versión 17.0 y adicionales de 2022, la opción del compilador habilita estas /std:c++latest características.
La compatibilidad del compilador con C11 y C17 requiere Visual Studio versión 16.8 o posterior de 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.
Estas características están habilitadas en todos los modos de opción del compilador /std 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.
La compatibilidad con la biblioteca C11 para esta característica requiere la compilación 10.0.20348.0 del SDK de Windows (versión 2104) o posterior.
Vea también
Referencia del lenguaje C++
Biblioteca estándar de C++
Mejoras de conformidad de C++ en Visual Studio
Novedades de Visual C++ en Visual Studio
Historial de cambios de Visual C++ de 2003 a 2015
Novedades de Visual C++ de 2003 a 2015
Blog del equipo de C++