基本型
数値型
標準 C++ のキーワードで提供される基本型は char 型を基本とする相対的な関係のみを表しており、型の具体的なサイズは仕様では定められておらず処理系依存でした。例えば int 型は short 型と同じか大きいということしか保証されません。これは、国際標準規格では処理系を特定できないためですが、この制約によって、処理系ごとにサイズを固定するための別名を用意しなければなりませんでした。Windows API における DWORD 型は典型的な例でしょう。
C++/CX においても C++ の標準型は原則として利用せず、C++/CX が対象とする Windows Runtime 上で共通する基本型(Fundamental types)がビルドインで提供されています。基本型には、標準 C++ の方に対応する、定義が明確な数値型(Numeric types)が含まれています。
C++/CX型 | 対応するC++型 | 内容 |
int8 | signed char | 8 ビット符号付き整数 |
uint8 | unsigned char | 8 ビット符号無し整数 |
int16 | short | 16 ビット符号付き整数 |
uint16 | unsigned short | 16 ビット符号無し整数 |
int32 | int | 32 ビット符号付き整数 |
uint32 | unsigned int | 32 ビット符号無し整数 |
int64 | long long | 64 ビット符号付き整数 |
uint64 | unsigned long long | 64 ビット符号無し整数 |
float32 | float | 32 ビット IEEE 754 浮動小数点数 |
float64 | double | 64 ビット IEEE 754 浮動小数点数 |
表1は C++/CX で提供される数値型です。これらの型を使うことで C++/CX のコードで明確なサイズの値を扱うことができ、Windows Runtime を通じて C# や JavaScript など、他のプログラミング言語と安全に値を交換できます。これら基本型は、標準 C++ の対応する型の別名として扱えます。例えば int32 型と int 型は同じように振る舞います。
#include <iostream> int main() { int8 i8 = 100; uint8 ui8 = 200; int32 i32 = 100000; float32 f32 = 3.1415F; std::wcout << L"i8=" << i8 << L"\n"; std::wcout << L"ui8=" << ui8 << L"\n"; std::wcout << L"i32=" << i32 << L"\n"; std::wcout << L"f32=" << f32 << L"\n"; system("pause"); return 0; }
コード1は C++/CX の整数型で変数を宣言し、その結果を標準出力に出力しています。C++/CX の基本型は C++ の基本型と相互運用可能であり、数値リテラルを変数に代入したり、または整数として取り出すことができます。前述したように int32 型と int 型は、コード上は同じように振る舞うので、C++ との違いを意識することはありません。
#include <iostream> int main() { std::wcout << L"int8=" << sizeof(int8) << L"\n"; std::wcout << L"uint8=" << sizeof(uint8) << L"\n"; std::wcout << L"int16=" << sizeof(int16) << L"\n"; std::wcout << L"uint16=" << sizeof(uint16) << L"\n"; std::wcout << L"int32=" << sizeof(int32) << L"\n"; std::wcout << L"uint32=" << sizeof(uint32) << L"\n"; std::wcout << L"int64=" << sizeof(int64) << L"\n"; std::wcout << L"uint64=" << sizeof(uint64) << L"\n"; std::wcout << L"float32=" << sizeof(float32) << L"\n"; std::wcout << L"float64=" << sizeof(float64) << L"\n"; system("pause"); return 0; }
コード2は C++/CX で提供される数値型のサイズを sizeof 演算子で出力したものです。表1に示した通り、それぞれの型で値を表現するために必要な記憶領域のサイズがバイト単位で得られています。
#include <iostream> int main() { int x = 10; int32 y = 20; std::wcout << x + y << L"\n"; system("pause"); return 0; }
コード3は C++ のキーワードで予約されている標準の int 型で宣言された x 変数と、C++/CX の int32 型で宣言された y 変数を用意し、これらを加算演算しています。実行結果のように、何の問題もなく加算することができ、C++/CX の基本型は標準 C++ の型と相互運用できることが確認できます。従って、C++ の標準関数や、他の Windows API と連携することも容易です。
文字型
C++/CX の文字は char16 型で表され、これは C++ における wchar_t 型に対応します。名前の通り 16 ビットの Unicode (UTF-16)を文字コードとしています。C++/CX 他の近代的なプログラミング言語やフレームワークと同様に国際化が前提となっており、古い Windows のマルチバイト文字は使わず Unicode 文字列を標準に用います。
#include <iostream> int main() { char16 c1 = 'A'; char16 c2 = L'W'; char16 c3 = L'萌'; std::wcout.imbue(std::locale("japanese")); std::wcout << L"c1=" << c1 << "\n"; std::wcout << L"c2=" << c2 << "\n"; std::wcout << L"c3=" << c3 << "\n"; system("pause"); return 0; }
コード4は char16 型の変数を文字リテラルで初期化しています。整数と同様に C++ の基本型との相互運用が可能で、単純な文字リテラルを char16 型の値として扱えます。実質的に char16 と wchar_t は同じ型として振る舞うため wchar_t 型を扱う標準関数そのまま利用できます。