.NET および UWP 用のコンポーネントの拡張機能

C++ 標準では、コンパイラ ベンダーがその言語に対して非標準の拡張機能を提供できます。 Microsoft では、ネイティブ C++ コードを .NET Framework またはユニバーサル Windows プラットフォーム (UWP) 上で実行されるコードに接続するために役立つ拡張機能を提供しています。 .NET 拡張機能は C++/CLI と呼ばれ、共通言語ランタイム (CLR) と呼ばれる .NET マネージド実行環境で実行されるコードを生成します。 UWP 拡張機能は C++/CX と呼ばれ、ネイティブ マシン コードを生成します。

Note

新しいアプリケーションでは、C++/CX ではなく C++/WinRT を使用することをお勧めします。 C++/WinRT は、Windows ランタイム API 用の新しい標準的な C++17 言語プロジェクションです。 C++/CX と WRL は引き続きサポートされますが、新しいアプリケーションでは C++/WinRT を使用することを強くお勧めします。 詳細については、「C++/WinRT」を参照してください。

2 つのランタイムに共通の拡張

C++/CLI は ISO/ANSI C++ 規格を拡張したものであり、Ecma C++/CLI 規格で定義されています。 詳細については、「C++/CLI による .NET プログラミング (Visual C++)」を参照してください。

C++/CX 拡張機能は、C++/CLI のサブセットです。 拡張構文はほとんどの場合は同じですが、生成されるコードは、UWP をターゲットする /ZW コンパイラ オプションまたは .NET をターゲットとする /clr オプションの指定に応じて異なります。 Visual Studio を使用してプロジェクトを作成すると、これらのスイッチが自動的に設定されます。

データ型のキーワード

これらの言語拡張には、空白で区切られた 2 つのトークンで構成される "集計キーワード" が含まれています。 これらのトークンは、単独で使用した場合と一緒に使用した場合で意味が異なることがあります。 たとえば、"ref" は通常の識別子であり、"class" はネイティブ クラスを宣言するキーワードです。 しかし、これらを組み合わせて ref class として使用した場合は、"ランタイム クラス" と呼ばれるエンティティを宣言する集計キーワードになります。

これらの拡張機能には、"状況依存キーワード" も含まれています。 キーワードが状況依存のキーワードとして扱われるかどうかは、キーワードを含むステートメントの種類と、そのステートメント内でのキーワードの配置で決まります。 たとえば、"property" というトークンは、識別子として使用されることもあれば、特殊なパブリック クラスのメンバーを宣言するために使用されることもあります。

次の表に、C++ 言語拡張のキーワードの一覧を示します。

Keyword 状況依存 目的 リファレンス
ref class

ref struct
いいえ クラスを宣言します。 クラスと構造体
value class

value struct
いいえ 値クラスを宣言します。 クラスと構造体
interface クラス

interface struct
いいえ インターフェイスを宣言します。 interface クラス
enum クラス

enum struct
いいえ 列挙型を宣言します。 enum クラス
property はい プロパティを宣言します。 property
delegate はい デリゲートを宣言します。 delegate (C++/CLI および C++/CX)
event はい イベントを宣言します。 event

オーバーライド指定子

次のキーワードは、派生のオーバーライド動作を修飾するために使用できます。 new キーワードは C++ の拡張ではありませんが、追加のコンテキストで使用できるキーワードとしてこの一覧に含めてあります。 一部の指定子は、ネイティブのプログラミングに対しても有効です。 詳細については、「方法: ネイティブ コンパイルでオーバーライド指定子を宣言する (C++/CLI)」を参照してください。

Keyword 状況依存 目的 リファレンス
abstract はい 関数またはクラスが抽象型であることを示します。 abstract
new いいえ 関数が基底クラスのバージョンのオーバーライドでないことを示します。 new (vtable の新しいスロット)
override はい メソッドが基底クラスのバージョンのオーバーライドでなければならないことを示します。 override
sealed はい クラスを基底クラスとして使用しないことを示します。 sealed

ジェネリックのキーワード

ジェネリック型をサポートするために追加されたキーワードを次に示します。 詳細については、「ジェネリック」を参照してください。

Keyword 状況依存 目的
generic いいえ ジェネリック型を宣言します。
where はい ジェネリック型パラメーターに適用される制約を指定します。

その他のキーワード

C++ 拡張に追加されたその他のキーワードを次に示します。

Keyword 状況依存 目的 リファレンス
最終的に はい 例外処理の既定の動作を示します。 例外処理
for each、in いいえ コレクションの要素を列挙します。 for each、in
gcnew いいえ ガベージ コレクション ヒープに型を割り当てます。 newdelete の代わりに使用します。 ref new、gcnew
ref new はい Windows ランタイム型を割り当てます。 newdelete の代わりに使用します。 ref new、gcnew
initonly はい 宣言または静的コンストラクターでしかメンバーを初期化できないことを示します。 initonly (C++/CLI)
literal はい リテラル変数を作成します。 literal
nullptr いいえ ハンドルまたはポインターでオブジェクトを参照しないことを示します。 nullptr

テンプレートの構成要素

次の言語構成要素は、キーワードとしてではなく、テンプレートとして実装されています。 /ZW コンパイラ オプションを指定した場合は lang 名前空間で定義され、 /clr コンパイラ オプションを指定した場合は cli 名前空間で定義され、

Keyword 目的 リファレンス
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

宣言子

割り当てられたオブジェクトの有効期間と削除をランタイムで自動的に管理するように指定する型の宣言子を次に示します。

Operator 目的 リファレンス
^ オブジェクトを識別するハンドル (使用できなくなったときに自動的に削除される 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 ごとに静的変数とグローバル変数を必須にする修飾子です。
C スタイル キャストと /clr (C++/CLI) C スタイル キャストがどのように解釈されるかについて説明します。
__clrcall 呼び出し規則 CLR 準拠の呼び出し規則を示します。
__cplusplus_cli 定義済みマクロ
カスタム属性 独自の CLR 属性を定義する方法について説明します。
例外処理 例外処理の概要を示します。
明示的なオーバーライド メンバー関数で任意のメンバーをオーバーライドする方法を示します。
フレンド アセンブリ (C++) クライアント アセンブリでアセンブリ コンポーネントのすべての型にアクセスする方法について説明します。
ボックス化 値型がボックス化される条件を示します。
型の特徴のコンパイラ サポート コンパイル時に型の特性を検出する方法について説明します。
マネージド、アンマネージド プラグマ 同じモジュールにマネージド 関数とアンマネージド 関数を共存させる方法を示します。
process__declspec 修飾子 __declspec 修飾子は、process ごとに静的変数とグローバル変数を必須にする修飾子です。
リフレクションの問題 (C++/CLI) CLR バージョンのランタイム型情報を示します。
String 文字列リテラルから String へのコンパイラによる変換について説明します。
型の転送 (C++/CLI) クライアント コードを再コンパイルしなくても済むように、出荷時のアセンブリの型を別のアセンブリに移動できるようにします。
ユーザー定義の属性 ユーザー定義の属性を示します。
#using ディレクティブ 外部アセンブリをインポートします。
XML に関するドキュメント /doc (ドキュメント コメントの処理) (C/C++) を使用した XML ベースのコード ドキュメントについて説明します。

関連項目

C++/CLI (Visual C++) による .NET プログラミング
ネイティブと .NET の相互運用性