Was sind C ++ / CX und C ++ / CLI und in welcher Beziehung stehen sie zu C ++ und WinRT?

31

Ich dachte darüber nach, die Herausforderung anzunehmen, C ++ für das Entwerfen von Metro-Apps zu lernen, und da stieß ich auf C ++ / CX.

Können Metro-Apps in C ++ 11 codiert werden? Benötigen sie C ++ / CX, um zu arbeiten? Und was genau ist C ++ / CX? Ist es möglich, eine Metro-App nur mit C ++ zu erstellen, oder ist C ++ / CX erforderlich? Wie fügt sich C ++ / CLI in dieses Bild ein?

Ein Doofus
quelle
Auch von der Verwendung von C ++ / CX wird jetzt abgeraten (C ++ / WinRT wird bevorzugt), siehe Dokumentation
SWdV

Antworten:

28

Früher erstellte Microsoft einfach ein C ++ - System, mit dem Sie auf die Windows-API (win32) zugreifen konnten. Eines Tages erfanden sie .NET und stellten fest, dass sich alles ändern musste.

Deshalb haben sie "Managed Extensions for C ++" erstellt, das im Grunde C ++ war, aber eine Menge nicht standardmäßiger Erweiterungen enthielt. Sie haben Schlüsselwörter hinzugefügt __gc, um .NET-Funktionen zu unterstützen (wie das Zuweisen auf dem GC-Heap und nicht auf dem nativen).

Aber die Leute mochten das nicht, da es nicht wirklich C ++ war, da es all diese zusätzlichen Schlüsselwörter enthielt, also hat Microsoft es umgestaltet und C ++ / CLI genannt, das eine viel kleinere Menge zusätzlicher Schlüsselwörter enthielt, aber Syntaxänderungen wie das ^(das ist) einführte Verweis 'Zeiger' auf ein .NET-Objekt auf dem GC-Heap).

Ein paar Jahre später stellte Microsoft fest, dass .NET nicht die Silberkugel ist, von der sie sagten, dass sie es ist. Außerdem haben sie ihre kämpfenden Windows- und Entwicklerteams zusammengeführt. Ein Teil dieser Neubewertung führte zur Erstellung einer brandneuen Windows-API mit dem Namen WinRT, bei der es sich ausschließlich um systemeigenen Code handelt. Daher waren die alten Erweiterungen nicht mehr nützlich. Daher entwickelte Microsoft ihre C ++ - Erweiterungen zu einer, die die Arbeit mit dem neuen ermöglichte WinRT-API einfacher - durch Beibehalten einiger Erweiterungen von C ++ / CLI (z. B. ^).

Also - los geht's, 3 verschiedene Versionen eines erweiterten C ++, das oberflächlich C ++ ist. Zumindest ist die neueste Version wieder nativer Code, sodass Sie die Erweiterungen nicht verwenden müssen, wenn Sie nicht möchten, da Sie direkt auf die API zugreifen können (sie heißt WRL und ähnelt weitgehend den alten ATL-Vorlagenklassen).

Wenn Sie denken, dass Sie plattformübergreifenden Code codieren, möchten Sie das nicht. Sie können die API-Aufrufe ändern, aber Sie können den ^auf keinem anderen Compiler als Visual C ++ verwenden. Ich würde empfehlen, die WRL-API zu verwenden und Ihren Code so standardmässig wie möglich zu halten, da der zusätzliche Code, den Sie im Vergleich zu C ++ / CX schreiben müssen, nicht so großartig ist.

gbjbaanb
quelle
Hinweis: C ++ / CX wird erst am Ende erwähnt. es wäre schön, ausdrücklich zu sagen, welches in seinem Absatz steht.
Eichel
11

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

. . . Während C ++ / CX syntaktisch C ++ / CLI ähnelt und daher in vielerlei Hinsicht fast gleich aussieht, ist es semantisch ziemlich unterschiedlich. C ++ / CX-Code ist nativer Code, keine CLR erforderlich. Das Programmieren in C ++ / CLI kann eine große Herausforderung sein, da zwei sehr unterschiedliche Objektmodelle gleichzeitig geschickt aufeinander abgestimmt werden müssen: das C ++ - Objektmodell mit seiner deterministischen Objektlebensdauer und das CLI-Objektmodell mit Speicherbereinigung. Mit C ++ / CX lässt sich viel einfacher arbeiten, da die auf COM basierende Windows-Runtime der Programmiersprache C ++ sehr gut zugeordnet ist.

Windows Runtime definiert eine relativ einfache, einfache Application Binary Interface (ABI) und fordert, dass Komponenten ihre Typen mithilfe eines gemeinsamen Metadatenformats definieren. C ++ / CX ist nicht unbedingt erforderlich, um eine native Windows Runtime-Komponente zu schreiben: Es ist durchaus möglich, Windows Runtime-Komponenten mit C ++ zu schreiben, ohne die C ++ / CX-Spracherweiterungen zu verwenden, und Visual C ++ 2012 enthält eine Bibliothek, die Windows Runtime C ++ Template Library ( WRL), um dies zu vereinfachen. Viele der im Lieferumfang von Windows enthaltenen Windows Runtime-Komponenten (im Windows-Namespace) werden mit WRL geschrieben. In C ++ / CX gibt es keine Magie: Es vereinfacht das Schreiben von Windows Runtime-Komponenten in C ++ erheblich und trägt dazu bei, die Menge an sich wiederholendem und ausführlichem Code zu reduzieren, die Sie bei Verwendung einer bibliotheksbasierten Lösung wie WRL schreiben müssten.

Matt
quelle