.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 | いいえ | ガベージ コレクション ヒープに型を割り当てます。 new と delete の代わりに使用します。 |
ref new、gcnew |
ref new | はい | Windows ランタイム型を割り当てます。 new と delete の代わりに使用します。 |
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 ベースのコード ドキュメントについて説明します。 |