C++/CX
C++/CX ( rozszerzenia komponentów C++) to projekcja języka dla platformy Microsoft Windows Runtime . Ma postać rozszerzenia języka dla kompilatorów C++ i umożliwia programistom C++ pisanie programów wywołujących interfejsy API Windows Runtime (WinRT) . C++/CX jest zastępowany przez projekcję języka C++/WinRT , która nie jest rozszerzeniem języka C++; jest to raczej całkowicie standardowa, nowoczesna biblioteka oparta na plikach nagłówkowych ISO C++ 17.
Rozszerzenia językowe zapożyczają składnię z języka C++/CLI , ale są ukierunkowane na kod natywny środowiska wykonawczego systemu Windows Universal Windows Platform zamiast środowiska uruchomieniowego języka wspólnego i kodu zarządzanego . Zapewnia zestaw abstrakcji składni i bibliotek, które projektują model programowania WinRT oparty na podzbiorze WRL COM w sposób intuicyjny dla programistów zarządzanych przez C++/CLI rozszerzeń.
Możliwe jest wywołanie środowiska wykonawczego systemu Windows z natywnego ISO C++ za pośrednictwem niższego poziomu biblioteki szablonów środowiska wykonawczego systemu Windows C++ (WRL). Jednak WRL jest również zastępowany przez C++/WinRT .
Składnia rozszerzenia
C++/CX wprowadza rozszerzenia składni do programowania dla środowiska wykonawczego systemu Windows. Ogólna składnia, która nie jest specyficzna dla platformy, jest zgodna ze C++ 11 .
Obiekty
Obiekty WinRT są tworzone lub aktywowane przy użyciu ref new
i przypisywane do zmiennych zadeklarowanych z notacją ^
(hat) odziedziczoną z C++/CLI.
Foo ^ foo = ref nowy Foo ();
Zmienna WinRT to po prostu para wskaźnika do wirtualnej tabeli metod i wskaźnika do wewnętrznych danych obiektu .
Liczenie referencji
Obiekt WinRT jest liczony w referencjach i dlatego obsługuje go podobnie jak zwykłe obiekty C++ zawarte w shared_ptrs . Obiekt zostanie usunięty, gdy nie będzie żadnych odniesień prowadzących do niego.
Nie ma mowy o wywozie śmieci . Niemniej jednak słowo kluczowe gcnew
zostało zarezerwowane do ewentualnego wykorzystania w przyszłości.
Klasy
Klasy wykonawcze
Istnieją specjalne rodzaje klas środowiska wykonawczego , które mogą zawierać konstrukcje rozszerzające komponenty. Są one po prostu określane jako klasy ref , ponieważ są deklarowane przy użyciu ref class
.
publiczna klasa referencyjna MojaKlasa { };
Zajęcia częściowe
C++/CX wprowadza koncepcję klas częściowych . Ta funkcja umożliwia podzielenie definicji pojedynczej klasy na wiele plików, głównie w celu umożliwienia graficznego interfejsu użytkownika XAML automatycznego generowania kodu w oddzielnym pliku, aby nie zepsuć logiki napisanej przez programistę. Części są później łączone podczas kompilacji.
Języki .NET, takie jak C#, mają tę funkcję od wielu lat. Klasy częściowe nie weszły jeszcze do C++ i dlatego nie mogą być używane nawet w C++20 .
Plik, który jest generowany i aktualizowany przez projektanta GUI, a zatem nie powinien być modyfikowany przez programistę. Zwróć uwagę na słowo kluczowe częściowe
.
// foo.private.h #pragma raz częściowy ref class foo { private : int id_ ; Platforma :: String ^ nazwa_ ; };
Plik, w którym programista zapisuje logikę interfejsu użytkownika. Importowany jest nagłówek, w którym zdefiniowana jest część klasy wygenerowana przez kompilator. Zauważ, że słowo kluczowe parts
nie jest konieczne.
// foo.public.h #pragma Once #include "foo.private.h" ref class foo { public : int GetId (); Platforma :: String ^ GetName (); };
Jest to plik, w którym zaimplementowane są składowe klasy częściowej.
// foo.cpp #include "pch.h" #include "foo.public.h" int foo::GetId () { return id_ ;} Platforma :: String ^ foo :: GetName { return name_ ;}
Generyki
Środowisko wykonawcze systemu Windows, a tym samym C++/CX, obsługuje typy ogólne oparte na środowisku wykonawczym . Informacje o typie ogólnym są zawarte w metadanych i tworzone w czasie wykonywania, w przeciwieństwie do szablonów C++ , które są konstrukcjami w czasie kompilacji. Oba są obsługiwane przez kompilator i można je łączyć.
rodzajowy < nazwa typu T > public ref class bag { właściwość T Item ; };
Metadane
Wszystkie programy WinRT udostępniają zadeklarowane klasy i członków poprzez metadane . Format jest taki sam, jaki został znormalizowany w ramach Common Language Infrastructure (CLI), standardu utworzonego na podstawie .NET Framework . Z tego powodu kod może być udostępniany w językach C++/CX, CLI i JavaScript, które są przeznaczone dla środowiska wykonawczego systemu Windows.
Biblioteka uruchomieniowa
C++/CX ma zestaw bibliotek przeznaczonych dla środowiska wykonawczego systemu Windows. Pomagają one połączyć funkcjonalność standardowej biblioteki C++ i WinRT.
Wykrywanie oparte na preprocesorze
Możesz wykryć, czy rozszerzenie C++/CX jest włączone, testując istnienie symbolu preprocesora __cplusplus_winrt
.
#ifdef __cplusplus_winrt // Specyficzny kod C++/CX znajduje się tutaj... #endif
Zobacz też
Linki zewnętrzne
- Wewnątrz projektu C++/CX — blog zespołu Visual C++
- GoingNative 3: Odcinek C++/CX z Marianem Luparu — kanał 9
- Pliki WinRT i winmd — blog Mariusa Bancili
- Dokumentacja języka Visual C++ (C++/CX)