# Microsoft Visual C++

Microsoft Visual C++ (MSVC) es un compilador para los lenguajes de programación C, C++, C++/CLI y C++/CX desarrollado por Microsoft. MSVC es software propietario. Originalmente era un producto independiente, pero luego se convirtió en parte de Visual Studio y estuvo disponible tanto en forma de software de prueba como software gratuito. Cuenta con herramientas para desarrollar y depurar código C++, especialmente código escrito para la API de Windows, DirectX y .NET.
Muchas aplicaciones requieren paquetes de biblioteca de tiempo de ejecución de Visual C++ redistribuibles para funcionar correctamente. Estos paquetes a menudo se instalan independientemente de las aplicaciones, lo que permite que varias aplicaciones hagan uso del paquete y solo tengan que instalarlo una vez. Estos paquetes de tiempo de ejecución y redistribuibles de Visual C++ se instalan principalmente para las bibliotecas estándar que utilizan muchas aplicaciones.

## Historia

El predecesor de Visual C++ fue Microsoft C / C++. También había un Microsoft QuickC 2.5 y un Microsoft QuickC para Windows 1.0. El compilador de Visual C++ todavía se conoce como Microsoft C / C++ y, a partir del lanzamiento de Visual C++ 2015 Update 2, está en la versión 14.0.23918.0

## Compatibilidad

ABI
La ABI del compilador de Visual C++ ha cambiado históricamente entre las versiones principales del compilador. Este es especialmente el caso de los contenedores STL, donde los tamaños de los contenedores han variado mucho entre las versiones del compilador. Por lo tanto, Microsoft recomienda no usar interfaces C++ en los límites de los módulos cuando se desea habilitar el código de cliente compilado con una versión de compilador diferente. En lugar de C++, Microsoft recomienda utilizar interfaces C o COM, que están diseñadas para tener una ABI estable entre las versiones del compilador.
Todas las versiones 14.x de MSVC tienen una ABI estable, y los binarios creados con estas versiones se pueden mezclar de manera compatible con versiones posteriores, teniendo en cuenta las siguientes restricciones:
* La versión del conjunto de herramientas utilizada debe ser igual o superior a la versión del conjunto de herramientas más alta utilizada para crear los binarios vinculados.
* La versión redistribuible de MSVC debe ser igual o superior a la versión del conjunto de herramientas utilizada por cualquier componente de la aplicación.
* Las bibliotecas estáticas o los archivos de objetos compilados con / GL (optimización de todo el programa) no son compatibles con los binarios entre las versiones y deben usar exactamente el mismo conjunto de herramientas.
Bibliotecas en tiempo de ejecución de C
Visual C++ incluye diferentes versiones de bibliotecas en tiempo de ejecución de C. Esto significa que los usuarios pueden compilar su código con cualquiera de las bibliotecas disponibles. Sin embargo, esto puede causar algunos problemas al usar diferentes componentes (DLL, EXE) en un mismo programa. Un ejemplo típico es un programa que utiliza diferentes bibliotecas. El usuario debe usar el mismo C Run-Time para todos los componentes del programa a menos que se comprendan las implicaciones. Microsoft recomienda utilizar la biblioteca de vínculos dinámicos multiproceso (opción de compilador / MD o / MDd) para evitar posibles problemas.
POSIX
Aunque el CRT de Microsoft implementa un gran subconjunto de interfaces POSIX, el compilador de Visual C++ emite una advertencia en cada uso de dichas funciones de forma predeterminada. La razón es que los estándares C y C++ requieren un prefijo de subrayado antes de las interfaces definidas por la implementación, por lo que el uso de estas funciones no es estándar. Sin embargo, los sistemas que en realidad son compatibles con POSIX no aceptarían estos nombres subrayados, y es más portable simplemente desactivar la advertencia.
C
Aunque originalmente era un IDE para el lenguaje de programación C, durante muchos años el soporte del compilador para ese lenguaje se ajustaba únicamente a la edición original del estándar C, que data de 1989, pero no a la revisión C99 del estándar. No había planes para apoyar el C99 incluso en 2011, más de una década después de su publicación.
Visual C++ 2013 finalmente agregó soporte para varias características de C99 en su modo C (incluidos inicializadores designados, literales compuestos y el tipo _Bool), aunque aún no estaba completo. Visual C++ 2015 mejoró aún más la compatibilidad con C99, con compatibilidad total con la biblioteca estándar C99, excepto para las funciones que requieren funciones del lenguaje C99 que aún no son compatibles con el compilador.
La mayoría de los cambios de la revisión C11 del estándar aún no son compatibles con Visual C++ 2017. Por ejemplo, las selecciones genéricas a través de la palabra clave _Generic no son compatibles con el compilador y dan como resultado un error de sintaxis.
El preprocesador se revisó en 2018, con C11 a la vista:
El soporte para _Generic se ha comprometido con MSVC a partir de febrero de 2020, aunque no está claro cuándo será incluido.
En septiembre de 2020, Microsoft anunció la compatibilidad con los estándares C11 y C17 en MSVC.