使用含有 _MBCS 程式碼的 TCHAR.H 資料類型
定義資訊清單常數 _MBCS
時,指定的泛型文字常式會對應至下列其中一種常式:
適當地處理多位元組位元組、字元與字串的 SBCS 常式。 在此案例中,字串引數類型必須是
char*
。 例如,_tprintf
對應到printf
;傳遞到printf
的字串引數類型是char*
。 若為字串類型使用_TCHAR
泛型文字資料類型,printf
的正式與實際參數類型會相符,因為_TCHAR*
對應到char*
。MBCS 特定常式。 在此案例中,字串引數類型必須是
unsigned char*
。 例如,_tcsrev
對應到_mbsrev
,它預期並傳回類型為unsigned char*
的字串。 如果您針對字串類型使用_TCHAR
泛型文字資料類型,可能會發生類型衝突,因為_TCHAR
會對應至 類型char
。
下面是防止此類型衝突 (以及可能會產生的 C 編譯器警告或 C++ 編譯器錯誤) 的三種解決方式:
使用預設行為。 tchar.h 提供執行時間程式庫中常式的泛型文字常式原型,如下列範例所示。
char * _tcsrev(char *);
在預設案例中,對應至
_mbsrev
Libc.lib 中 Thunk 的原型_tcsrev
。 這會將傳入參數的類型_mbsrev
和傳出傳回值從_TCHAR*
(也就是char *
) 變更為unsigned char *
。 此方法可確保使用_TCHAR
時的類型比對,但由於函式呼叫額外負荷,所以比較慢。透過在您的程式碼中併入下列前置處理器陳述式,以內嵌方式使用函式。
#define _USE_INLINING
此方法會導致 tchar.h 中提供的內嵌函式 Thunk,將泛型文字常式直接對應至適當的 MBCS 常式。 下列來自 tchar.h 的程式碼摘錄提供如何完成此作業的範例。
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
若您可以使用內嵌,這是最佳解決方式,因為它可以保證類型相符,而且沒有任何額外成本。
在程式碼中併入下列預處理器語句,以使用直接對應。
#define _MB_MAP_DIRECT
若您不想使用預設行為或無法使用內嵌,此方法提供快速替代方式。 它會導致宏直接對應至常式的 MBCS 版本,如下列來自 tchar.h 的範例所示。
#define _tcschr _mbschr
當您採用此方法時,必須小心,以確保針對字串引數和字串傳回值使用適當的資料類型。 您可以使用類型轉換來確保適當的類型相符,或者可以使用
_TXCHAR
泛型文字資料類型。_TXCHAR
對應到 SBCS 代碼中的類型char
,但對應到 MBCS 代碼中的類型unsigned char
。 如需泛型文字宏的詳細資訊,請參閱 執行時間程式庫參考 中的 泛型文字對應 。