_TCHAR のマッピング
C++ 用 Unicode:インデックス への移動
目次
C++Builder の _TCHAR マッピングは、ワイド文字列またはナロー文字列のいずれかと一緒に使われるソース コードの記述を簡単にすることを目的としています。 FireMonkey、VCL、または Windows API で必要な適切な文字列型がコードで使用され、RTL 関数が適切な定義(それぞれ、ワイド型またはナロー型)に設定されるように、_TCHAR を wchar_t
または char
のいずれかにマップできます。 [_TCHAR のマップ先]オプションを設定するには、プロジェクト > オプション... > [C++ (共有オプション)] ダイアログ ボックスを使用します。
C++ アプリケーションでは、ワイド文字列とナロー文字列の両方を扱う必要があります。
- C++ RTL には、
char
とwchar_t
の両方のために設計されたルーチンがあります。 - Windows API は通常はナロー型なので、
char
が必要になります。 - FireMonkey と VCL (2009 以降)は、
wchar_t
を必要とするワイド文字列データ(Unicode)を使用します。
FireMonkey と VCL とのやり取りでは、ワイド RTL 関数を使用するか、FireMonkey または VCL にデータを渡す前に適切な変換を行う必要があります。 (「UTF-8 変換ルーチン」を参照)。
_TCHAR は、tchar.h ヘッダー ファイルで条件付きで宣言されており、char
または wchar_t
のいずれかにマッピングされる typedef(エイリアス)として定義されています。 移植性のある(C++ RTL、Windows API、FireMonkey、および VCL とやり取りできる)コードを記述したい場合、_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++ (共有オプション)] ダイアログ ボックスを使用します。
FireMonkey と VCL では [_TCHAR のマップ先]で wchar_t
を使用
FireMonkey と VCL は Unicode で実装されており、常に Unicode を想定しています。デフォルトで _TCHAR は wchar_t
にマッピングされます。
たとえば次のコードは、[_TCHAR のマップ先]オプションを[wchar_t]
に設定しないとコンパイルが成功しません。
TResourceStream* res = new TResourceStream(HInstance, ResourceId, RT_RCDATA);
[_TCHAR のマップ先]オプションが char に設定されている場合、RT_RCDATA
は char*
にマッピングされます。FireMonkey と VCL は wchar_t*
を想定しているため、FireMonkey や VCL で作業する場合、この char 設定は問題となります。
[_TCHAR のマップ先]を wchar_t
で使用するために必要なコード変更
_TCHAR を wchar_t
にマッピングする場合(デフォルト設定)、プロジェクトに _tmain
または _tWinMain
でのエントリ ポイントが必要となります。C++Builder を使用して作成した新規プロジェクトは、デフォルトでこのエントリ ポイントを持っています。ただし、インポートしたプロジェクトの場合は、このエントリ ポイントを手動で追加する必要があるかもしれません。
tchar.h ヘッダー ファイルをインクルードする必要もあります。これには必要なエントリ ポイントとマップ定義が含まれます。 tchar.h に含まれるマップ関数のリストについては、「マップ関数」を参照してください。
メモ:
_tmain
ではなくmain
をエントリ ポイントに使用すると、リンカは実行可能ファイルをリンクできません。 FireMonkey または VCL を使用する新規プロジェクトでは、ウィサードによって自動的に_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"