_TCHAR マッピング
C++ 用 Unicode:インデックス への移動
C++Builder の _TCHAR マッピングは、ワイド文字列またはナロー文字列のいずれかと一緒に使われるソース コードの記述を簡単にすることを目的としています。 RAD Studio フレームワークおよびライブラリ、または Windows API で必要な適切な文字列型がコードで使用され、RTL の使用:インデックス 関数が適切な定義(それぞれ、ワイド型またはナロー型)に設定されるように、_TCHAR を wchar_t
または char
のいずれかにマップできます。 [_TCHAR のマップ先]オプションを設定するには、[プロジェクト|オプション...|C++(共有オプション)] ダイアログ ボックスを使用します。
C++ アプリケーションでは、ワイド文字列とナロー文字列の両方を扱う必要があります。
- C++ RTL には、
char
とwchar_t
の両方のために設計されたルーチンがあります。 - Windows API は通常はナロー型なので、
char
が必要になります。 - RAD Studio フレームワークおよびライブラリでは、ワイド文字列データ(Unicode)を使用しているため、
wchar_t
が必要になります。
RAD Studio フレームワークおよびライブラリとのやり取りでは、ワイド RTL 関数を使用するか、RAD Studio フレームワークおよびライブラリにデータを渡す前に適切な変換を行う必要があります。 (「UTF-8 変換ルーチン」を参照)。
_TCHAR は、tchar.h ヘッダー ファイルで条件付きで宣言されており、char または wchar_t
のいずれかにマッピングされる typedef
(エイリアス)として定義されています。 移植性のあるコード(C++ RTL、Windows API、RAD Studio フレームワークおよびライブラリなどとやり取りできるコード)を記述した場合は、_TCHAR を使用しなければなりません(データ型 char
や wchar_t
をハード コーディングする代わりに)。そして、[_TCHAR のマップ先]オプションを[char]
または[wchar_t]
に設定します([C++(共有オプション)]ページ)。 たとえば、現在の _TCHAR マッピング設定は、アプリケーションが RTL マップ関数のANSI バージョンを使用するか、ワイド バージョンを使用するかを制御します。
目次
[_TCHAR のマップ先]オプション
プロジェクト オプション[_TCHAR のマップ先]では、コードにおける _TCHAR
のマップ定義を制御します。
_TCHAR
は、次の表に示すように、char
または wchar_t
にマッピングすることができます。
[_TCHAR のマップ先]オプションの値
CHAR |
_TCHAR を char に置き換えます。
|
wchar_t |
|
[ディレクトリと条件定義]ページの[_TCHAR のマップ先]オプションの設定
[プロジェクト|オプション...|C++(共有オプション)]ダイアログ ボックスを使用します。
RAD Studio フレームワークおよびライブラリには、[_TCHAR のマップ先]を[wchar_t]
に設定
RAD Studio フレームワークおよびライブラリは Unicode で実装されており、常に Unicode の使用が想定されています。デフォルトで _TCHAR は wchar_t
にマッピングされます。
たとえば次のコードは、[_TCHAR のマップ先]オプションを[wchar_t]
に設定しないとコンパイルが成功しません。
TResourceStream* res = new TResourceStream(HInstance, ResourceId, RT_RCDATA);
[_TCHAR のマップ先]オプションが[char]に設定されていると、RT_RCDATA
は char*
にマッピングされます。
RAD Studio フレームワークおよびライブラリは wchar_t*
を想定しているため、RAD Studio フレームワークおよびライブラリを利用する場合、 char の設定では問題が発生します。
[_TCHAR のマップ先]を[wchar_t]
にするために必要なコード変更
[_TCHAR のマップ先]を[wchar_t]
(デフォルト)に設定した場合、プロジェクトには _tmain
または _tWinMain
というエントリ ポイントが必要になります。 C++Builder を使用して作成した新規プロジェクトは、デフォルトでこのエントリ ポイントを持っています。ただし、インポートしたプロジェクトの場合は、このエントリ ポイントを手動で追加する必要があるかもしれません。
tchar.h ヘッダー ファイルをインクルードする必要もあります。これには必要なエントリ ポイントとマップ定義が含まれます。 tchar.h に含まれるマップ関数の一覧は、「マップ関数」を参照してください。
メモ:
_tmain
ではなくmain
をエントリ ポイントに使用すると、リンカは実行可能ファイルをリンクできません。 RAD Studio フレームワークおよびライブラリを使用する新規プロジェクトでは、ウィサードによって自動的に_tmain
エントリ ポイントが挿入されます。
テキスト リテラル前での _TEXT
マクロの使用
文字リテラルと文字列リテラルを ANSI または Unicode に正しくマッピングできるようにするには、_TEXT
マクロか _T
マクロのどちらかを使用します。 例:
::MessageBox(0, _TEXT("The message"), _TEXT("The caption"), MB_OK);
_UNICODE が定義されていると、_TEXT
(または _T
)マクロはリテラル文字列(文字)を先頭に L を付けた形式に変換します。それ以外の場合、_TEXT
は L
接頭辞を付けずにリテラルを変換します。 たとえば、_UNICODE を定義して次のように記述すると、
_TEXT("The message")
次のように先頭に L を付けた形式に変換されます。
L"The message"
それ以外の場合、このマクロは L
接頭辞を付けず、次のように変換します。
"The message"