Cosa sono C ++ / CX e C ++ / CLI e come si relazionano a C ++ e WinRT?

28

Stavo considerando di accettare la sfida di imparare C ++ per progettare le app Metro e in quel momento mi sono imbattuto in C ++ / CX.

Le app Metro possono essere codificate in C ++ 11? Richiedono C ++ / CX per funzionare? E cos'è esattamente C ++ / CX? È possibile creare un'app Metro utilizzando solo C ++ o è richiesto C ++ / CX? Inoltre, come si collega C ++ / CLI a questa immagine?

    
posta Ein Doofus 24.08.2012 - 15:28
fonte

2 risposte

26

Microsoft era solito creare un sistema C ++ che permettesse di accedere alle API di Windows (chiamate win32), poi un giorno inventarono .NET e capirono che tutto doveva cambiare.

Così hanno creato "Managed Extensions per C ++" che era fondamentalmente C ++ ma con un carico di estensioni non standard, aggiungendo parole chiave come __gc per supportare le caratteristiche .NET (come l'allocazione sull'heap GC piuttosto che su quella nativa)

Ma a questa gente non piaceva perché non era così; t C ++, con tutte quelle parole chiave extra, così Microsoft lo ridisegnò e lo chiamò C ++ / CLI, che aveva un insieme molto più piccolo di parole chiave aggiuntive, ma introdusse cambiamenti di sintassi come il ^ (che è un 'puntatore' di riferimento per un oggetto .NET sull'heap GC).

Alcuni anni dopo Microsoft ha realizzato che .NET non è il proiettile d'argento che hanno detto di essere, e ha unito anche i suoi team Windows e Developer. Parte di questa rivalutazione ha portato alla creazione di una nuovissima API Windows, chiamata WinRT, che è interamente codice nativo e questo significava che le vecchie estensioni non erano più utili, quindi Microsoft ha sviluppato le estensioni C ++ a una che ha reso possibile lavorare con il nuovo API WinRT più semplice - mantenendo alcune estensioni da C ++ / CLI (come ^).

Quindi, ecco qua, 3 diverse versioni di un C ++ esteso che è superficialmente C ++. Almeno l'ultima versione è di nuovo il codice nativo, quindi non è necessario utilizzare le estensioni se non si desidera, poiché è possibile accedere direttamente all'API (si chiama WRL ed è molto simile alle vecchie classi di template ATL)

Se pensi che potresti codificare codice multipiattaforma che non vorresti, puoi cambiare le chiamate API, ma non puoi usare ^ su nessun compilatore diverso da Visual C ++. Ti consigliamo di utilizzare l'API WRL e di mantenere il tuo codice il più standard possibile, dato che il "codice extra" che avresti bisogno di scrivere rispetto a C ++ / CX non è così eccezionale.

    
risposta data 30.08.2012 - 23:13
fonte
11

Citare link :

. . . while C++/CX is syntactically similar to C++/CLI and thus looks almost the same in many ways, it is semantically quite different. C++/CX code is native code, no CLR required. Programming in C++/CLI can be very challenging, as one must deftly juggle two very different object models at the same time: the C++ object model with its deterministic object lifetimes, and the garbage-collected CLI object model. C++/CX is much simpler to work with, because the Windows Runtime, which is based on COM, maps very well to the C++ programming language.

Windows Runtime defines a relatively simple, low-level Application Binary Interface (ABI), and mandates that components define their types using a common metadata format. C++/CX is not strictly required to write a native Windows Runtime component: it is quite possible to write Windows Runtime components using C++ without using the C++/CX language extensions, and Visual C++ 2012 includes a library, the Windows Runtime C++ Template Library (WRL), to help make this easier. Many of the Windows Runtime components that ship as part of Windows (in the Windows namespace) are written using WRL. There's no magic in C++/CX: it just makes writing Windows Runtime components in C++ much, much simpler and helps to cut the amount of repetitive and verbose code that you would have to write when using a library-based solution like WRL.

    
risposta data 30.08.2012 - 23:00
fonte

Leggi altre domande sui tag