定義指令清單常數 _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 *);在預設案例中,對應至
_tcsrevLibc.lib 中 Thunk 的原型_mbsrev。 這會將傳入參數的類型_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。 如需泛型文字巨集的詳細資訊,請參閱運行時間連結庫參考中的泛型文字對應。