C++/CX (Visual C++ Component Extensions,Visual C++ 組件擴展) 是微軟的C++編譯器對C++的擴展,使得程式設計師可以比較方便地編寫面向Windows Runtime(WinRT)的程序。這個語言規範引入了一系列語法和類庫抽象,以對C++程式設計師來說比較自然的方式暴露了基於組件對象模型(COM)的WinRT編程范型的接口。
此條目沒有列出任何參考或來源。 (2014年9月23日) |
擴展語法
C++/CX為WinRT編程引入了新的語法。和平台獨立的語法和C++11標準兼容。
WinRT物件的創建方式是通過ref new
關鍵字,並賦值給具有^
(帽子)註記的類型的變量,這個帽子標記是繼承自C++/CLI。
Foo^ foo = ref new Foo();
一個WinRT變量僅僅是一對指針,一個指向虛函數表(Virtual method table(頁面存檔備份,存於互聯網檔案館)),另一個指向物件的內部數據(Opaque pointer(頁面存檔備份,存於互聯網檔案館))。
一個WinRT物件是使用引用計數模式來維護其生命期的,處理方式類似於被智能指針封裝的常規C++物件。物件在沒有引用時銷毀。儘管沒有垃圾回收機制,但是語言規範也保留了gcnew關鍵字以備以後使用。
運行類型包含了元件擴展的建構函式。這類型也被簡單地稱為 ref classes,因為它們是用 ref class
創建的。
public ref class MyClass
{
};
C++/CX引入了局部類型的概念。這個特性使得一個類的定義可以被分離到多個文件,使得XAML圖形用戶界面設計工具能夠自動生成部分代碼到一個單獨的文件,以避免干擾程式設計師寫的代碼。這些局部類型在編譯時合併。這個特性在類似C#之類的CLI語言中已經存在很多年。局部類型並未成為C++標準,所以並不能在純C++11代碼中使用。
這裏是一個設計工具生成的局部類型示例:
// 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_;}
WinRT支持泛型,所以C++/CX也支持。泛型類的信息被保留在元數據內,在運行時才實例化,而不是像C++模板那樣在編譯時示例化。編譯器支持在一個類型中同時使用泛型和模板。
泛型類示例:
generic<typename T>
public ref class bag
{
property T Item;
};
元數據 (Metadata)
所有WinRT程序都通過元數據來描述其中的類型。元數據的格式和通用語言架構(CLI)為.NET Framework規定的標準一致。這個特性使得C++/CX、CLI語言和Javascript的代碼可以互相引用。
運行庫 (Runtime library)
C++/CX有一系列針對WinRT的代碼庫,幫助C++程式設計師將使用C++標準程式庫的代碼移植到WinRT.
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.