使用含有 _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 會在執行時間程式庫中提供常式的泛型文字常式原型,如下列範例所示。
char * _tcsrev(char *);
在預設案例中,會透過 Libc 中的 Thunk 對應至
_mbsrev
的原型_tcsrev
。 這會將傳入參數和傳出傳回值的類型_mbsrev
從_TCHAR*
(() )char *
變更為unsigned char *
。 當您使用_TCHAR
時,這個方法可確保類型相符,但因為函式呼叫的額外負荷,所以會相當緩慢。透過在您的程式碼中併入下列前置處理器陳述式,以內嵌方式使用函式。
#define _USE_INLINING
這個方法會造成 tchar 中提供的內嵌函式 Thunk,以將泛型文字常式直接對應至適當的 MBCS 常式。 下列程式碼摘錄自 tchar,提供如何完成這項操作的範例。
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
若您可以使用內嵌,這是最佳解決方式,因為它可以保證類型相符,而且沒有任何額外成本。
在您的程式碼中併入下列預處理器語句,以使用直接對應。
#define _MB_MAP_DIRECT
若您不想使用預設行為或無法使用內嵌,此方法提供快速替代方式。 它會讓宏將一般文字常式直接對應到常式的 MBCS 版本,如下列 tchar 範例所示。
#define _tcschr _mbschr
當您採用這種方法時,必須小心確保針對字串引數和字串傳回值使用適當的資料類型。 您可以使用類型轉換來確保適當的類型相符,或者可以使用
_TXCHAR
泛型文字資料類型。_TXCHAR
對應到 SBCS 代碼中的類型char
,但對應到 MBCS 代碼中的類型unsigned char
。 如需有關泛型文字宏的詳細資訊,請參閱《執行時間程式庫參考》中的泛型文字對應。