次の方法で共有


_MBCSでの tchar.h データ型の使用

Microsoft 固有の仕様

ジェネリック テキスト ルーチン マッピングの表が示すように ( Generic-text マッピングを参照)、マニフェスト定数 _MBCS が定義されている場合、特定のジェネリック テキスト ルーチンは次のいずれかのルーチンにマップされます。

  • マルチバイト、文字、文字列を適切に処理する SBCS ルーチン。 この場合、文字列引数は char* 型であることを想定しています。 たとえば、_tprintfprintf にマップされ、printf への文字列引数は char* 型になります。 文字列型として汎用テキストのデータ型である _TCHAR を使用する場合、printf_TCHAR* にマップされるため char* の仮パラメーターと実パラメーターの型は一致します。

  • MBCS 固有ルーチン。 この場合、文字列引数は unsigned char* 型であることを想定しています。 たとえば、_tcsrev は、_mbsrev 型の文字列を必要とし、それを返す unsigned char* にマップされます。 ここでも、文字列型に _TCHAR ジェネリック テキスト データ型を使用する場合、 _TCHAR が型 charにマップされるため、型の競合が発生する可能性があります。

この型の競合 (および C コンパイラの警告または C++ コンパイラのエラーという結果) を回避するためには、次のような 3 つの解決方法があります。

  • 既定の動作を使用します。 次の例のように、TCHAR.H はランタイム ライブラリのルーチンに対して汎用テキスト ルーチンのプロトタイプを提供します。

    char *_tcsrev(char *);
    

    既定では、_tcsrev のプロトタイプは LIBC.LIB のサンクを介して _mbsrev にマップされます。 このサンクは、 _mbsrev 受信パラメーターと送信戻り値の型を _TCHAR* ( char* など) から unsigned char*に変更します。 このメソッドは、 _TCHARを使用している場合に型の一致を保証しますが、関数呼び出しのオーバーヘッドが原因で比較的遅くなります。

  • コードに次のプリプロセッサ ステートメントを組み込むことにより、関数のインライン展開を使用します。

    #define _USE_INLINING
    

    この方法では、TCHAR.H で提供されるインライン関数サンクにより、汎用テキスト ルーチンが直接、適切な MBCS ルーチンにマップされます。 TCHAR からの次のコードの抜粋。H では、その方法の例を示します。

    __inline char *_tcsrev(char *_s1)
    {return (char *)_mbsrev((unsigned char *)_s1);}
    

    インライン化を使用できる場合は、型の一致が保証され、余分な時間コストがないため、これが最適なソリューションです。

  • コードに次のプリプロセッサ ステートメントを組み込むことにより、"直接マッピング" を使用します。

    #define _MB_MAP_DIRECT
    

    この方法は、既定の動作を使用したくない場合、またはインライン展開を使用できない場合の簡単な代替手段です。 TCHAR.H の次の例のように、マクロによって、汎用テキスト ルーチンは MBCS バージョンのルーチンにマップされます。

    #define _tcschr _mbschr
    

この方法を採用する場合は、文字列の引数と文字列の戻り値に適切なデータ型を使用するように注意してください。 適切に型を一致させるために型キャストを使用できます。または、汎用テキストのデータ型である _TXCHAR を使用できます。 _TXCHAR は SBCS コードでは char 型にマップされますが、MBCS コードでは unsigned char 型にマップされます。 汎用テキスト マクロの詳細については、「 Generic-text マッピング」を参照してください。

Microsoft 固有の仕様はここまで

関連項目

国際化
カテゴリ別ユニバーサル C ランタイム ルーチン