文書の過去の版を表示しています。
C++/CLI
以前のバージョン(Visual Studio 2002、2003)では、C++マネージ拡張(Managed Extensions for C++、または、Managed C++)と呼ばれていて、C++をCLR(Common Language Runtime)向けにMicrosoftが独自拡張したものであった。
Visual Studio 2005からは、C++/CLIとしてC++をCLI(共通言語基盤 - Common Language Infrastructure)向けに拡張したものとなっており、C++/CLIはそれ自身がC++と上位互換のある1つの言語としてECMA標準(Standard ECMA-372、翻訳版:C++/CLI 言語仕様書)となりISO標準化の動きもある。
今では「C++マネージ拡張」という言葉はC++/CLI以前の古いC++拡張のことを意味しており、C++/CLIは.NET Framework上で動作するプログラムを作るための新しいプログラミング言語のことを意味する。また、CLR(共通言語ランタイム)を扱うもっともローレベルなプログラミング言語として位置づけられている。
以前の古いコードとの違い
C++マネージ拡張のコード
[C++マネージ拡張]
#include <windows.h> #using <mscorlib.dll> #using <System.Windows.Forms.dll> using namespace System::Windows::Forms; int __stdcall WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { MessageBox::Show("C++マネージ拡張を使用した Hello World!"); return 0; }
コードをビルドするには、構成プロパティの設定が必要。
構成プロパティの設定(Visual C++ 2008 Express Edition)
- [全般]
- 共通言語ランタイム サポート: 共通言語ランタイム サポート、古い構文 (/clr:oldSyntax)
- [C/C++] - [プリコンパイル済みヘッダ]
- プリコンパイル済みヘッダーの作成/使用: プリコンパイル済みヘッダーを使用しない
- [リンカ] - [システム]
- サブシステム: 設定なし
- [リンカ] - [詳細]
- エントリ ポイントなし: はい (/NOENTRY)
C++/CLIのコード
[C++/CLI]
using namespace System::Windows::Forms; int main(array<System::String^>^ args) { MessageBox::Show("C++/CLIを使用した Hello World!"); return 0; }
コードをビルドするには、構成プロパティの設定が必要。
構成プロパティの設定(Visual C++ 2008 Express Edition)
- [全般]
- 共通言語ランタイム サポート: 共通言語ランタイム サポート (/clr)
- [C/C++] - [プリコンパイル済みヘッダ]
- プリコンパイル済みヘッダーの作成/使用: プリコンパイル済みヘッダーを使用しない
- [リンカ] - [システム]
- サブシステム: Windows (/SUBSYSTEM:WINDOWS)
- [リンカ] - [詳細]
- エントリ ポイント: main
- エントリ ポイントなし: いいえ
3つのクラスとその特徴
C++/CLIでは次の3種類のクラスを使い分けることができる。そして、それぞれはメモリ管理などの特徴が異なる。
種類 | 説明 |
---|---|
ネイティブ クラス(native class) | ネイティブC++のクラス。 CRT ヒープにメモリが確保されて格納される。 |
refクラス(ref class) | 参照型と呼ばれ System.Object から暗黙的に派生している。 Framework クラス ライブラリの殆どの型は参照型である。 マネージ ヒープにメモリが確保されて格納される。 |
値クラス(value class) | 値型と呼ばれ System.ValueType から暗黙的に派生している。 CTS(共通型システム)の組み込み型であるSystem.Byte、System.Int32、System.Boolean、 System.Char、System.Decimalなどの構造体や列挙体は値型である。 列挙体は特殊な値型であり、組み込みの符号付きまたは符号なし整数型をベースとし、System.Enumから派生している。 値型はスレッドのスタックメモリに領域が確保されて格納される。 |