適用於 .NET 與 UWP 的元件擴充功能
C++ 標準讓編譯器廠商能夠為此語言提供非標準的擴充功能。 Microsoft 提供擴充功能,可協助您將 C++ 機器碼連線至在 .NET Framework 或通用 Windows 平台 (UWP) 上執行的程式碼。 .NET 擴充功能稱為 C++/CLI,並會產生要在稱為 Common Language Runtime (CLR) 的 .NET 受控執行環境中執行的程式碼。 UWP 擴充功能稱為 C++/CX,而它們會產生原生機器碼。
注意
對於新的應用程式,我們建議使用 C++/WinRT 而不是 C++/CX。 C++/WinRT 是適用於 Windows 執行階段 API 的新標準 C++17 語言投影。 我們將繼續支援 C++/CX 和 WRL,但強烈建議讓新的應用程式使用 C++/WinRT。 如需詳細資訊,請參閱 C++/WinRT。
兩種執行階段,一組擴充功能
C++/CLI 會擴充 ISO/ANSI C++ 標準,並根據 Ecma C++/CLI 標準來定義。 如需詳細資訊,請參閱以 C++/CLI 進行 .NET 程式設計 (Visual C++)。
C++/CX 擴充功能為 C++/CLI 的子集。 雖然在大部分情況下擴充功能語法會完全相同,但產生的程式碼取決於您是否指定 /ZW
編譯器選項以將目標設定為 UWP,或指定 /clr
選項以將目標設定為 .NET。 當您使用 Visual Studio 以建立專案時,會自動設定這些參數。
資料類型關鍵字
語言擴充功能包含「彙總關鍵字」,這類關鍵字會由空白字元分隔的兩個語彙基元所組成。 當語彙基元分開使用時,可能有一個意義,當它們一起使用時,則有另一個意義。 例如,"ref" 這個字是一般的識別項,而 "class" 這個字是宣告原生類別的關鍵字。 但是,當這些字組合併以形成 ref class 時,產生的彙總關鍵字會宣告實體,也就是「執行階段類別」。
擴充功能也包括「內容關鍵性」關鍵字。 關鍵字會被視為視內容而有所區別,取決於包含它的陳述式類型,以及它在該陳述式中的位置。 例如,語彙基元 "property" 可以是識別碼,或者它可以宣告一種特殊的公用類別成員。
下表列出在 C++ 語言擴充功能中的關鍵字。
關鍵字 | 視內容而有所區別 | 目的 | 參考 |
---|---|---|---|
ref class ref struct |
No | 宣告類型。 | 類別和結構 |
value class value struct |
No | 宣告值類型。 | 類別和結構 |
介面類別 interface struct |
No | 宣告介面。 | 介面類別 |
enum 類別 enum struct |
No | 宣告列舉。 | enum 類別 |
property |
Yes | 宣告屬性。 | property |
delegate | Yes | 宣告委派。 | 委派 (C++/CLI 和 C++/CX) |
event | Yes | 宣告事件。 | event |
覆寫指定名稱
您可以使用下列關鍵字限定衍生的覆寫行為。 雖然 new
關鍵字不是 C++ 的延伸模組,它列在這裡是因為可以用於其他內容中。 某些規範對於原生程式設計也有效。 如需詳細資訊,請參閱作法:在原生編譯中宣告覆寫規範 (C++/CLI)。
關鍵字 | 視內容而有所區別 | 目的 | 參考 |
---|---|---|---|
abstract | Yes | 表示函式或類別為抽象。 | abstract |
new |
No | 表示函式不是基底類別版本的覆寫。 | new (vtable 中的新位置) |
override | Yes | 表示方法必須是基底類別版本的覆寫。 | override |
sealed | Yes | 避免將類別做為基底類別。 | sealed |
泛型的關鍵字
下列關鍵字已加入以支援泛型類型。 如需詳細資訊,請參閱泛型。
關鍵字 | 視內容而有所區別 | 目的 |
---|---|---|
generic | No | 宣告泛型類型。 |
where | Yes | 指定套用至泛型類型參數的條件約束。 |
其他關鍵字
下列關鍵字已加入至 C++ 擴充功能。
關鍵字 | 視內容而有所區別 | 目的 | 參考 |
---|---|---|---|
finally | Yes | 表示預設例外狀況處理行為。 | 例外狀況處理 |
for each, in | No | 列舉集合的項目。 | for each, in |
gcnew | No | 在記憶體回收堆積上配置類型。 改用 new 和 delete 。 |
ref new、gcnew |
ref new | Yes | 配置 Windows 執行階段型別。 改用 new 和 delete 。 |
ref new、gcnew |
initonly | Yes | 表示成員只能在宣告或靜態建構函式中初始化。 | initonly (C++/CLI) |
literal | Yes | 建立常值變數。 | literal |
nullptr |
No | 指出控制代碼或指標未指向物件。 | nullptr |
範本建構
下列語言建構會實作為範本,而不是關鍵字。 如果您指定 /ZW
編譯器選項,則它們會在 lang
命名空間中定義。 如果您指定 /clr
編譯器選項,則它們會在 cli
命名空間中定義。
關鍵字 | 目的 | 參考 |
---|---|---|
array | 宣告陣列。 | 陣列 |
interior_ptr | (只有 CLR) 指向參考類型中的資料。 | interior_ptr (C++/CLI) |
pin_ptr | (只有 CLR) 指向 CLR 參考類型以暫時隱藏記憶體回收系統。 | pin_ptr (C++/CLI) |
safe_cast | 決定並執行執行階段類型的最佳轉型方法。 | safe_cast |
typeid |
(只有 CLR) 擷取 System.Type 物件,該物件描述指定類型或物件。 | typeid |
宣告子
下列類型宣告子會指示執行階段自動管理配置物件的存留期和刪除。
運算子 | 目的 | 參考 |
---|---|---|
^ |
宣告物件的控制代碼;也就是,一個指向 Windows 執行階段或 CLR 物件的指標,不再使用它時即會自動刪除。 | 物件控制代碼運算子 (^) |
% |
宣告追蹤參考;也就是,Windows 執行階段或 CLR 物件的參考,不再使用它時即會自動刪除。 | 追蹤參考運算子 |
其他建構和相關主題
本節列出與 CLR 有關的其他程式設計建構和主題。
主題 | 說明 |
---|---|
__identifier (C++/CLI) | (Windows 執行階段和 CLR) 可將關鍵字當作識別碼使用。 |
變數引數清單 (...) (C++/CLI) | (Windows 執行階段和 CLR) 讓函式能夠接受可變數目的引數。 |
C++ 原生類型的 .NET Framework 對等項 (C++/CLI) | 列出用來取代 C++ 整數類型的 CLR 類型。 |
appdomain __declspec 修飾詞 |
__declspec 修飾詞,要求每個 appdomain 都有靜態和全域變數。 |
使用 /clr 進行 C-Style 轉換 (C++/CLI) | 描述 C-style 轉換的解譯方式。 |
__clrcall 呼叫慣例 | 表示符合 CLR 規範的呼叫慣例。 |
__cplusplus_cli |
預先定義的巨集 |
自訂屬性 | 描述如何定義您自己的 CLR 屬性。 |
例外狀況處理 | 提供例外狀況處理的概觀。 |
明確覆寫 | 示範成員函式如何覆寫任意成員。 |
Friend 組件 (C++) | 討論用戶端組件如何存取組件元件中的所有類型。 |
Boxing | 示範 boxed 處理值類型的條件。 |
類型特徵的編譯器支援 | 討論如何在編譯時偵測類型的特性。 |
managed、unmanaged pragmas | 示範 Managed 和 Unmanaged 函式如何共存於相同的模組。 |
process __declspec 修飾詞 |
__declspec 修飾詞,要求每個程序都有靜態和全域變數。 |
反映 (C++/CLI) | 示範執行階段類型資訊的 CLR 版本。 |
String | 討論字串常值到 String 的編譯器轉換。 |
類型轉送 (C++/CLI) | 在傳送組件中讓類型移動到另一個組件,讓用戶端程式碼不需要重新編譯。 |
使用者定義屬性 | 示範使用者定義屬性。 |
#using 指示詞 | 匯入外部組件。 |
XML 文件 | 使用 /doc (處理文件註解) (C/C++) 來說明 XML 型程式碼文件 |