Tchar.h における汎用テキストのマッピング

更新 : 2007 年 11 月

コードを簡単に国際対応にできるように、Microsoft が提供するランタイム ライブラリには、多くのデータ型やルーチンなどのオブジェクトに対して、Microsoft 固有の汎用テキストのマッピングが用意されています。Tchar.h で定義されているこれらのマッピングを使用した場合、#define ステートメントで定義したマニフェスト定数に応じて、1 バイト、マルチバイト、Unicode のどれにでも対応できるジェネリック コードを記述できます。汎用テキストのマップは Microsoft 固有の拡張機能であり、ANSI とは互換性がありません。

Tchar.h を使用することにより、同じソースから 1 バイト、MBCS、Unicode の各アプリケーションをビルドできます。Tchar.h では、_tcs プレフィックスが付いたマクロが定義されており、正しいプリプロセッサ定義により、str_mbs、または wcs のいずれかの関数に割り当てられます。MBCS をビルドするには、シンボル _MBCS を定義します。Unicode をビルドするには、シンボル _UNICODE を定義します。1 バイト アプリケーションをビルドする場合は、どちらも定義しません (既定)。MFC アプリケーションでは、既定として、_MBCS が定義されています。

_TCHAR データ型は、Tchar.h で条件に応じて定義されます。ビルドのために _UNICODE シンボルが定義されている場合は、_TCHAR は wchar_t として定義されます。それ以外の場合は、1 バイトと MBCS をビルドするために char として定義されます。Unicode のワイド文字データ型である wchar_t は、8 ビット符号付き char の 16 ビット版に相当します。国際対応のアプリケーションでは、バイトではなく _TCHAR を扱う _tcs ファミリの関数を使う必要があります。たとえば、_tcsncpy は、n バイトではなく n 個の _TCHAR だけコピーします。

SBCS 文字列処理関数の中には、符号付きの char* パラメータを取るものがあります。このため、_MBCS を定義すると、型の不一致を知らせる警告メッセージがコンパイラから出力される場合があります。この警告を避けるには、次の 3 とおりの方法があります。一番効率的な方法から順に示します。

  1. タイプ セーフなインライン関数サンクを Tchar.h で使用します。これは既定の動作です。

  2. コマンド ラインで _MB_MAP_DIRECT を定義して、Tchar.h で直接マクロを使用します。この場合は、型を手作業で一致させる必要があります。これは一番速い方法ですが、タイプ セーフではありません。

  3. Tchar.h でタイプ セーフな静的にリンクされたライブラリ関数サンクを使用します。この場合は、コマンド ラインで _NO_INLINING 定数を定義します。これは、一番時間がかかりますが、一番タイプ セーフな方法です。

汎用テキスト マップ用プリプロセッサ ディレクティブ

#define

コンパイル後の状態

_UNICODE

Unicode (ワイド文字)

_tcsrev_wcsrev に割り当てられる。

_MBCS

マルチバイト文字

_tcsrev_mbsrev に割り当てられる。

なし (既定。_UNICODE_MBCS も未定義)

SBCS (ASCII)

_tcsrevstrrev に割り当てられる。

たとえば、Tchar.h で定義されている汎用テキスト関数 _tcsrev は、プログラムで _MBCS が定義されていると _mbsrev になり、_UNICODE が定義されていると _wcsrev になります。それ以外の場合、_tcsrevstrrev に割り当てられます。プログラミングに便利なように他のデータ型のマッピングも Tchar.h に用意されていますが、_TCHAR が最も多く使用されます。

汎用テキストのデータ型のマップ

汎用テキスト

データ型名

_UNICODE および

_MBCS が未定義の場合

_MBCS

が定義されている場合

_UNICODE

が定義されている場合

_TCHAR

char

char

wchar_t

_TINT

int

int

wint_t

_TSCHAR

signed char

signed char

wchar_t

_TUCHAR

unsigned char

unsigned char

wchar_t

_TXCHAR

char

unsigned char

wchar_t

_T または _TEXT

影響なし (プリプロセッサによって削除される)

影響なし (プリプロセッサによって削除される)

L (後続の文字や文字列を対応する Unicode の文字や文字列に変換する)

ルーチンや変数などのオブジェクトの汎用テキスト マッピングの詳細な一覧については、「ランタイム ライブラリ リファレンス」の「汎用テキストのマップ」を参照してください。

c426s321.alert_note(ja-jp,VS.90).gifメモ :

Unicode の文字列には NULL バイトが含まれている可能性があるため、この文字列と一緒に str ファミリの関数を使用しないでください。同様に、MBCS (または SBCS) 文字列では、wcs ファミリの関数を使用しないでください。

MBCS、Unicode、SBCS の各モデルに割り当てるために _TCHAR_tcsrev を使用するコード例は、次のとおりです。

_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);

_MBCS が定義されていると、プリプロセッサによって次のコードに変換されます。

char *RetVal, *szString;
RetVal = _mbsrev(szString);

_UNICODE が定義されていると、プリプロセッサによって次のコードに変換されます。

wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);

_MBCS_UNICODE のいずれも定義されていない場合は、プリプロセッサによって 1 バイトの ASCII コードに変換されます。

char *RetVal, *szString;
RetVal = strrev(szString);

このように、1 つのソース コード ファイルを記述、保守、およびコンパイルして、3 種類の文字セットそれぞれに固有のルーチンを実行できます。

参照

概念

C++ の文字セット

_MBCS コードでの TCHAR.H データ型の使用