Microsoft 固有の仕様
ジェネリック テキスト ルーチン マッピングの表が示すように ( Generic-text マッピングを参照)、マニフェスト定数 _MBCS
が定義されている場合、特定のジェネリック テキスト ルーチンは次のいずれかのルーチンにマップされます。
マルチバイト、文字、文字列を適切に処理する SBCS ルーチン。 この場合、文字列引数は
char*
型であることを想定しています。 たとえば、_tprintf
はprintf
にマップされ、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 固有の仕様はここまで