С++/CX
C++/CX (расширения компонентов C++) — это языковая проекция для Microsoft платформы Windows Runtime . Он принимает форму расширения языка для C++ компиляторов и позволяет программистам C++ писать программы, вызывающие среды выполнения Windows (WinRT) API-интерфейсы . C++/CX заменяется проекцией языка C++/WinRT , которая не является расширением языка C++; скорее, это совершенно стандартная современная библиотека ISO C++17 на основе заголовочных файлов. [ 1 ]
Языковые расширения заимствуют синтаксис из C++/CLI, но ориентированы на универсальной платформы Windows собственный код среды выполнения Windows, а не на среду Common Language Runtime и управляемый код . Он содержит набор абстракций синтаксиса и библиотек, которые проецируют таким WinRT на основе подмножества WRL COM модель программирования образом, который интуитивно понятен программистам управляемых расширений C++/CLI.
Среду выполнения Windows можно вызвать из собственного ISO C++ нижнего уровня через библиотеку шаблонов C++ среды выполнения Windows (WRL). Однако WRL также заменяется C++/WinRT . [ 1 ]
Синтаксис расширения
[ редактировать ]C++/CX представляет расширения синтаксиса для программирования для среды выполнения Windows. Общий синтаксис, не зависящий от платформы, совместим со стандартом C++11 .
Объекты
[ редактировать ]Объекты WinRT создаются или активируются с помощью ref new
и присваивается переменным, объявленным с помощью ^
(шляпа), унаследованная от C++/CLI.
Foo^ foo = ref new Foo();
Переменная WinRT — это просто пара указателей на таблицу виртуальных методов объекта и указателей на внутренние данные .
Подсчет ссылок
[ редактировать ]Объект WinRT учитывает количество ссылок и поэтому обрабатывается аналогично обычным объектам C++, заключенным вshared_ptrs . Объект будет удален, когда не останется ссылок, ведущих на него.
не Никакой уборки мусора предусмотрено. Тем не менее, ключевое слово gcnew
был зарезервирован для возможного использования в будущем.
Классы
[ редактировать ]Классы времени выполнения
[ редактировать ]Существуют специальные виды классов времени выполнения , которые могут содержать конструкции расширения компонентов. Их просто называют ссылочными классами, потому что они объявляются с использованием ref class
.
public ref class MyClass
{
};
Частичные занятия
[ редактировать ]В C++/CX представлена концепция частичных классов . Эта функция позволяет разделить определение одного класса на несколько файлов, в основном для того, чтобы XAML инструменты проектирования графического пользовательского интерфейса могли автоматически генерировать код в отдельном файле, чтобы не нарушать логику, написанную разработчиком. Части позже объединяются при компиляции.
В языках .NET, таких как C#, эта функция имеется уже много лет. Частичные классы еще не вошли в стандарт C++ и поэтому не могут использоваться даже в C++20 .
Файл, который создается и обновляется разработчиком графического интерфейса и поэтому не должен изменяться программистом. Обратите внимание на ключевое слово partial
.
// foo.private.h
#pragma once
partial ref class foo
{
private:
int id_;
Platform::String^ name_;
};
Файл, в который программист записывает логику пользовательского интерфейса. Импортируется заголовок, в котором определена сгенерированная компилятором часть класса. Обратите внимание, что ключевое слово partial
в этом нет необходимости.
// foo.public.h
#pragma once
#include "foo.private.h"
ref class foo
{
public:
int GetId();
Platform::String^ GetName();
};
Это файл, в котором реализованы члены разделяемого класса.
// foo.cpp
#include "pch.h"
#include "foo.public.h"
int foo::GetId() {return id_;}
Platform::String^ foo::GetName {return name_;}
Дженерики
[ редактировать ]Среда выполнения Windows и, следовательно, C++/CX поддерживают дженерики на основе среды выполнения . Информация об общем типе содержится в метаданных и создается во время выполнения, в отличие от шаблонов C++ , которые представляют собой конструкции времени компиляции. Оба поддерживаются компилятором и могут комбинироваться.
generic<typename T>
public ref class bag
{
property T Item;
};
Метаданные
[ редактировать ]Все программы WinRT предоставляют свои объявленные классы и члены через метаданные . Формат тот же, что был стандартизирован как часть Common Language Infrastructure (CLI), стандарта, созданного на основе .NET Framework . Благодаря этому код можно использовать совместно с языками C++/CX, CLI и JavaScript, предназначенными для среды выполнения Windows.
Библиотека времени выполнения
[ редактировать ]В C++/CX имеется набор библиотек, предназначенных для среды выполнения Windows. Они помогают объединить функциональность стандартной библиотеки C++ и WinRT.
Обнаружение на основе препроцессора
[ редактировать ]Вы можете определить, включено ли расширение C++/CX, проверив наличие __cplusplus_winrt
символ препроцессора.
#ifdef __cplusplus_winrt
// C++/CX specific code goes here...
#endif
См. также
[ редактировать ]Ссылки
[ редактировать ]- ^ Перейти обратно: а б Введение в C++/WinRT docs.microsoft.com