Co to są C ++ / CX i C ++ / CLI i jak odnoszą się do C ++ i WinRT?

31

Rozważałem podjęcie nauki języka C ++ do projektowania aplikacji Metro i wtedy natknąłem się na C ++ / CX.

Czy aplikacje Metro mogą być kodowane w C ++ 11? Czy wymagają C ++ / CX do działania? A czym dokładnie jest C ++ / CX? Czy można utworzyć aplikację Metro przy użyciu tylko C ++, czy też wymagana jest C ++ / CX? W jaki sposób C ++ / CLI wiąże się z tym obrazem?

Ein Doofus
źródło
Odradza się

Odpowiedzi:

28

Microsoft zwykł po prostu tworzyć system C ++, który umożliwia dostęp do ich Windows API (o nazwie win32), a następnie pewnego dnia wynalazł .NET i stwierdził, że wszystko musi się zmienić.

Stworzyli więc „Managed Extensions for C ++”, który był w zasadzie C ++, ale z mnóstwem niestandardowych rozszerzeń, dodając słowa kluczowe, __gcktóre wspierają funkcje .NET (takie jak alokacja na stercie GC, a nie natywnym)

Ale ludziom się to nie podobało, bo tak naprawdę nie było; C C ++, z tymi wszystkimi dodatkowymi słowami kluczowymi, więc Microsoft przeprojektował go i nazwał C ++ / CLI, który miał znacznie mniejszy zestaw dodatkowych słów kluczowych, ale wprowadził zmiany składniowe takie jak ^(który jest referencyjny „wskaźnik” do obiektu .NET na stercie GC).

Kilka lat później Microsoft zdał sobie sprawę, że .NET nie jest srebrną kulą, o której mówili, i połączyli również swoje walczące zespoły Windows i deweloperów. Część tej ponownej oceny doprowadziła do stworzenia zupełnie nowego Windows API, zwanego WinRT, który jest całkowicie natywnym kodem, co oznaczało, że stare rozszerzenia nie były już przydatne, więc Microsoft opracował swoje rozszerzenia C ++ do takiego, które działały z nowym Interfejs API WinRT jest łatwiejszy - dzięki zachowaniu kilku rozszerzeń z C ++ / CLI (takich jak ^).

A więc - proszę bardzo, 3 różne wersje rozszerzonego C ++, którym jest powierzchownie C ++. Przynajmniej najnowsza wersja jest znowu rodzimym kodem, więc nie musisz używać rozszerzeń, jeśli nie chcesz, ponieważ możesz uzyskać bezpośredni dostęp do interfejsu API (nazywa się WRL i przypomina stare klasy szablonów ATL)

Jeśli uważasz, że kodujesz kod między platformami, nie będziesz tego chciał - możesz zmienić wywołania interfejsu API, ale nie możesz używać go ^na żadnym kompilatorze innym niż Visual C ++. Polecam korzystanie z interfejsu WRL API i utrzymanie standardowego kodu, ponieważ „dodatkowy kod”, który należy napisać w porównaniu do C ++ / CX, nie jest tak świetny.

gbjbaanb
źródło
Uwaga: C ++ / CX nie jest wspomniany do końca; dobrze byłoby jednoznacznie powiedzieć, który z nich znajduje się w akapicie.
Acorn
11

Powołując się na http://blogs.msdn.com/b/vcblog/archive/2012/08/29/cxxcxpart00anintroduction.aspx :

. . . podczas gdy C ++ / CX jest syntaktycznie podobny do C ++ / CLI, a zatem wygląda prawie tak samo pod wieloma względami, jest semantycznie całkiem inny. Kod C ++ / CX jest rodzimym kodem, nie wymaga CLR. Programowanie w C ++ / CLI może być bardzo trudne, ponieważ trzeba zręcznie żonglować dwoma bardzo różnymi modelami obiektów w tym samym czasie: model obiektowy C ++ z deterministycznymi okresami istnienia obiektu oraz model obiektowy CLI zbierany przez śmieci. C ++ / CX jest znacznie prostszy w obsłudze, ponieważ środowisko uruchomieniowe systemu Windows oparte na modelu COM bardzo dobrze odwzorowuje język programowania C ++.

Środowisko wykonawcze systemu Windows definiuje stosunkowo prosty, niskopoziomowy interfejs binarny aplikacji (ABI) i upoważnia komponenty do definiowania swoich typów przy użyciu wspólnego formatu metadanych. C ++ / CX nie jest ściśle wymagany do napisania macierzystego komponentu środowiska wykonawczego Windows: jest całkiem możliwe pisanie komponentów środowiska wykonawczego Windows za pomocą C ++ bez użycia rozszerzeń języka C ++ / CX, a Visual C ++ 2012 zawiera bibliotekę, bibliotekę szablonów Windows Runtime C ++ ( WRL), aby ułatwić to. Wiele składników środowiska wykonawczego Windows, które są dostarczane jako część systemu Windows (w przestrzeni nazw Windows), jest napisanych przy użyciu WRL. W C ++ / CX nie ma magii: sprawia, że ​​pisanie składników środowiska wykonawczego Windows w C ++ jest o wiele prostsze i pomaga ograniczyć ilość powtarzalnego i pełnego kodu, który musiałbyś napisać, korzystając z rozwiązania opartego na bibliotece, takiego jak WRL.

Matt
źródło