Que sont C ++ / CX et C ++ / CLI, et comment sont-ils liés à C ++ et WinRT?

31

J'envisageais de relever le défi d'apprendre le C ++ pour concevoir des applications Metro et c'est à ce moment que j'ai rencontré C ++ / CX.

Les applications Metro peuvent-elles être codées en C ++ 11? Ont-ils besoin de C ++ / CX pour fonctionner? Et qu'est-ce que C ++ / CX exactement? Est-il possible de créer une application Metro en utilisant uniquement C ++, ou est-ce que C ++ / CX est requis? De plus, comment C ++ / CLI est-il lié à cette image?

Ein Doofus
la source
L'utilisation de C ++ / CX est également déconseillée maintenant (C ++ / WinRT est préférable), voir la documentation
SWdV

Réponses:

28

Microsoft fabriquait simplement un système C ++ qui vous permettait d'accéder à son API Windows (appelée win32), puis un jour, ils ont inventé .NET et ont pensé que tout devait changer.

Ils ont donc créé des "extensions gérées pour C ++" qui étaient essentiellement du C ++ mais avec une charge d'extensions non standard, ajoutant des mots clés comme __gcpour prendre en charge les fonctionnalités .NET (comme l'allocation sur le tas GC plutôt que natif)

Mais les gens n'aimaient pas cela car ce n'était vraiment pas le cas; t C ++, ayant tous ces mots clés supplémentaires, alors Microsoft l'a repensé et l'a appelé C ++ / CLI, qui avait un ensemble beaucoup plus petit de mots clés supplémentaires mais a introduit des changements de syntaxe comme le ^(qui est un «pointeur» de référence vers un objet .NET sur le tas GC).

Quelques années plus tard, Microsoft a réalisé que .NET n'était pas la solution miracle qu'ils l'avaient dit, et ils ont également fusionné leurs équipes Windows et Developer en lutte. Une partie de cette réévaluation a conduit à la création d'une toute nouvelle API Windows, appelée WinRT, qui est entièrement en code natif et cela signifiait que les anciennes extensions n'étaient plus utiles, alors Microsoft a développé leurs extensions C ++ pour en faire une qui rendait le travail avec le nouveau API WinRT plus facile - en conservant quelques extensions de C ++ / CLI (comme le ^).

Donc - voilà, 3 versions différentes d'un C ++ étendu qui est superficiellement C ++. Au moins, la dernière version est à nouveau du code natif, vous n'avez donc pas besoin d'utiliser les extensions si vous ne le souhaitez pas car vous pouvez accéder directement à l'API (elle s'appelle WRL et ressemble beaucoup aux anciennes classes de modèles ATL)

Si vous pensez que vous codez du code multiplateforme, vous ne le voudrez pas - vous pouvez modifier les appels d'API, mais vous ne pouvez pas utiliser le ^sur un compilateur autre que Visual C ++. Je recommanderais d'utiliser l'API WRL et de garder votre code aussi standard que possible étant donné que le `` code supplémentaire '' que vous auriez besoin d'écrire par rapport à C ++ / CX n'est pas si bon.

gbjbaanb
la source
Remarque: C ++ / CX n'est pas mentionné jusqu'à la fin; ce serait bien de dire explicitement lequel est dans son paragraphe.
Acorn
11

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

. . . Alors que C ++ / CX est syntaxiquement similaire à C ++ / CLI et semble donc presque le même à bien des égards, il est sémantiquement très différent. Le code C ++ / CX est un code natif, aucun CLR n'est requis. La programmation en C ++ / CLI peut être très difficile, car il faut jongler habilement avec deux modèles d'objets très différents en même temps: le modèle d'objet C ++ avec ses durées de vie déterministes et le modèle d'objet CLI récupéré. C ++ / CX est beaucoup plus simple à utiliser, car Windows Runtime, qui est basé sur COM, correspond très bien au langage de programmation C ++.

Windows Runtime définit une interface binaire d'application (ABI) relativement simple et de bas niveau, et oblige les composants à définir leurs types à l'aide d'un format de métadonnées commun. C ++ / CX n'est pas strictement requis pour écrire un composant Windows Runtime natif: il est tout à fait possible d'écrire des composants Windows Runtime à l'aide de C ++ sans utiliser les extensions de langage C ++ / CX, et Visual C ++ 2012 comprend une bibliothèque, la bibliothèque de modèles Windows Runtime C ++ ( WRL), pour vous faciliter la tâche. De nombreux composants Windows Runtime fournis avec Windows (dans l'espace de noms Windows) sont écrits à l'aide de WRL. Il n'y a pas de magie dans C ++ / CX: cela rend l'écriture des composants Windows Runtime en C ++ beaucoup, beaucoup plus simple et aide à réduire la quantité de code répétitif et verbeux que vous auriez à écrire lors de l'utilisation d'une solution basée sur une bibliothèque comme WRL.

Mat
la source