¿Qué son C ++ / CX y C ++ / CLI, y cómo se relacionan con C ++ y WinRT?

31

Estaba considerando asumir el desafío de aprender C ++ para diseñar aplicaciones de Metro y fue entonces cuando me encontré con C ++ / CX.

¿Se pueden codificar las aplicaciones de Metro en C ++ 11? ¿Requieren C ++ / CX para funcionar? ¿Y qué es exactamente C ++ / CX? ¿Es posible crear una aplicación Metro usando solo C ++, o se requiere C ++ / CX? Además, ¿cómo se vincula C ++ / CLI en esta imagen?

Ein Doofus
fuente
También se desaconseja el uso de C ++ / CX ahora (se prefiere C ++ / WinRT), consulte los documentos
SWdV

Respuestas:

28

Microsoft solía hacer simplemente un sistema C ++ que le permitiera acceder a su API de Windows (llamado win32), luego un día inventaron .NET y pensaron que todo tenía que cambiar.

Entonces crearon "Extensiones administradas para C ++", que era básicamente C ++ pero con una carga de extensiones no estándar, agregando palabras clave como __gcpara admitir características .NET (como la asignación en el montón de GC en lugar de la nativa)

Pero a la gente no le gustó esto, ya que en realidad no era; t C ++, que tenía todas esas palabras clave adicionales, por lo que Microsoft lo rediseñó y lo llamó C ++ / CLI, que tenía un conjunto mucho más pequeño de palabras clave adicionales pero introdujo cambios de sintaxis como el ^(que es un 'puntero' de referencia a un objeto .NET en el montón de GC).

Unos años más tarde, Microsoft se dio cuenta de que .NET no es la bala de plata que dijeron que era, y también fusionaron sus equipos de Windows y Desarrolladores en combate. Parte de esta reevaluación condujo a la creación de una nueva API de Windows, llamada WinRT, que es un código completamente nativo y esto significaba que las extensiones antiguas ya no eran útiles, por lo que Microsoft desarrolló sus extensiones C ++ a una que hizo que trabajar con el nuevo WinRT API es más fácil: al mantener algunas extensiones de C ++ / CLI (como la ^).

Entonces, ahí tienes, 3 versiones diferentes de un C ++ extendido que es superficialmente C ++. Al menos la última versión es código nativo nuevamente, por lo que no necesita usar las extensiones si no lo desea, ya que puede acceder directamente a la API (se llama WRL y se parece mucho a las antiguas clases de plantillas ATL)

Si cree que podría estar codificando código multiplataforma que no desea, puede cambiar las llamadas a la API, pero no puede usar ^en ningún compilador que no sea Visual C ++. Recomiendo usar la API WRL y mantener su código lo más estándar posible dado el 'código adicional' que necesitaría escribir en comparación con C ++ / CX no es tan bueno.

gbjbaanb
fuente
Nota: C ++ / CX no se menciona hasta el final; Sería bueno decir explícitamente cuál está en su párrafo.
Bellota
11

Citando http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . Si bien C ++ / CX es sintácticamente similar a C ++ / CLI y, por lo tanto, se ve casi igual en muchos aspectos, es semánticamente bastante diferente. El código C ++ / CX es código nativo, no se requiere CLR. La programación en C ++ / CLI puede ser muy desafiante, ya que uno debe hacer malabarismos con destreza con dos modelos de objetos muy diferentes al mismo tiempo: el modelo de objetos C ++ con sus vidas deterministas de objetos y el modelo de objetos CLI recolectados de basura. C ++ / CX es mucho más simple de trabajar, porque Windows Runtime, que se basa en COM, se asigna muy bien al lenguaje de programación C ++.

Windows Runtime define una interfaz binaria de aplicación (ABI) relativamente simple y de bajo nivel, y exige que los componentes definan sus tipos utilizando un formato de metadatos común. C ++ / CX no es estrictamente necesario para escribir un componente nativo de Windows Runtime: es muy posible escribir componentes de Windows Runtime usando C ++ sin usar las extensiones de lenguaje C ++ / CX, y Visual C ++ 2012 incluye una biblioteca, la Biblioteca de plantillas de Windows Runtime C ++ ( WRL), para ayudar a hacer esto más fácil. Muchos de los componentes de Windows Runtime que se envían como parte de Windows (en el espacio de nombres de Windows) se escriben usando WRL. No hay magia en C ++ / CX: simplemente hace que escribir componentes de Windows Runtime en C ++ sea mucho, mucho más simple y ayuda a reducir la cantidad de código repetitivo y detallado que tendría que escribir al usar una solución basada en biblioteca como WRL.

Mate
fuente