# C++/CX

C++/CX (Component eXtensions) son un conjunto de extensiones al lenguaje de programación C++ desarrolladas por Microsoft con el objetivo de simplificar la escritura de programas para la plataforma Windows Runtime. Incorpora una nueva sintaxis similar a C++/CLI pero con la diferencia que C++/CX se compila a código nativo que se ejecuta directamente en la CPU, sin necesidad de utilizar el CLR.

## Introducción

Las extensiones para componentes de Visual C++, C++/CX, son un conjunto de extensiones del lenguaje C++ que permiten la creación de aplicaciones de Windows Store y de componentes WinRT de una manera lo más cercana posible a lo que ha venido a llamarse "C++ moderno". Representan el nuevo modelo de programación nativa en C++ sobre Windows y su uso permite crear diferentes tipos de programas:
* Aplicaciones en C++ para Windows Store que utilizan XAML para definir su interfaz de usuario.
* Componentes en C++ para Windows Runtime que pueden ser utilizados por otras aplicaciones de Windows Store escritas en C++, C# o JavaScript.
* Juegos DirectX y aplicaciones intensivas en gráficos para la Windows Store.
Aunque sería posible desarrollar aplicaciones para Windows Store programando directamente contra los interfaces COM del Windows Runtime, el uso de C++/CX permite utilizar constructores, excepciones, herencia y otras características de C++ que no están disponibles en un objeto COM.

## Características

En el aspecto técnico, C++/CX es de hecho un subconjunto de C++/CLI, sin embargo, la forma en la que se implementa es totalmente distinta, no usa el CLR ni utiliza un recolector de basura, generando únicamente código nativo (x32, x64 o ARM). En cambio, escribir aplicaciones en C++/CX no es como escribir aplicaciones normales de C++, además, la interoperabilidad entre código C++ puro y WinRT puede llegar a ser muy costosa.

### Tipos

El sistema de tipos de C++/CX se compone de los siguientes elementos:
* Espacios de nombres
* Tipos básicos
* Cadenas
* Enumeraciones
* Arrays
* Estructuras y clases por referencia
* Estructuras y clases por valor
* Propiedades
* Delegados
* Eventos
* Interfaces
* Atributos

### Windows metadata

Al compilar una aplicación o componente C++/CX, se genera un fichero con extensión .winmd o Windows Metada. Estos ficheros contienen la descripción de los tipos WinRT declarados como públicos, incluyendo clases, estructuras, enumeraciones, interfaces y delegados. Este formato es similar al usado en el .NET Framework pero con la diferencia que solo contiene metadatos, situándose el código ejecutable en otros ficheros.
Para que un tipo sea publicado en el fichero de metadatos debe declararse dentro de un espacio de nombres y definirse como públicos. Una ref class puede declararse privada y por lo tanto ser invisible en los metadatos (estará disponible solo internamente). Incluso dentro de una clase pública, algunos de sus miembros pueden declararse privados y otros públicos. La siguiente tabla muestra la relación entre los especificadores de acceso de una clase en C++ y su visibilidad en los ficheros de metadatos:
| Visible en los metadatos | Oculto en los metadatos |
| public | private |
| protected | internal |
| public protected | private protected |
Para inspeccionar el contenido de un fichero .winmd se puede utilizar el programa Object Browser.