Použití datových typů TCHAR.H s kódováním _MBCS
Když je definována konstanta manifestu _MBCS, mapuje se daná rutina obecného textu na jednu z následujících druhů rutin:
Rutina SBCS, která odpovídajícím způsobem zpracovává vícebajtové bajty, znaky a řetězce.V tomto případě jsou očekávány řetězcové argumenty typu char*.Například _tprintf se mapuje na printf; řetězcové argumenty printf jsou typu char *.Používáte-li datový typ obecného textu _TCHAR pro vaše typy řetězců, formální a skutečné typy parametrů pro printf odpovídají, protože se _TCHAR* mapuje na char*.
Rutina specifická pro znakovou sadu MBCS.V tomto případě jsou řetězcové argumenty očekávány typu unsigned char*.Například _tcsrev se mapuje na _mbsrev, který očekává a vrací řetězec unsigned char*.Používáte-li datový typ obecného textu _TCHAR pro vaše typy řetězců, existuje zde potenciální konflikt typů, protože _TCHAR se mapuje na typ char.
Následují tři řešení pro prevenci tohoto konfliktu typů (a upozornění kompilátoru C nebo chyb kompilátoru C++, které by nastaly):
Použijte výchozí chování.Tchar.h poskytuje prototypy rutin obecného textu pro rutiny v knihovnách run-time, jako v následujícím příkladu.
char * _tcsrev(char *);
Ve výchozím případě se prototyp pro _tcsrev mapuje na _mbsrev prostřednictvím volání kódu s jinou bitovou šířkou v Libc.lib.To mění typy příchozích parametrů _mbsrev a odchozí návratové hodnoty z _TCHAR * (to znamená char *) na unsigned char *.Tato metoda zajišťuje shodu typů při použití _TCHAR, ale je relativně pomalá kvůli režii volání funkce.
Použijte vkládání funkcí začleněním následujícího výrazu preprocesoru do vašeho kódu.
#define _USE_INLINING
Tato metoda způsobí volání kódu vložené funkce s jinou bitovou šířkou, poskytnutou v Tchar.h, pro mapování rutiny obecného textu přímo na příslušnou rutinu znakové sady MBCS.Následující výňatek kódu z Tchar.h poskytuje příklad způsobu provedení.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
Pokud lze použít vkládání, je toto nejlepším řešením, protože zaručuje typovou shodu a nestojí žádný čas navíc.
Použijte přímé mapování začleněním následujícího výrazu preprocesoru ve vašem kódu.
#define _MB_MAP_DIRECT
Tento přístup poskytuje rychlou alternativu, pokud nechcete použít výchozí chování nebo nelze použít vkládání.To způsobuje, že je rutina obecného textu mapována makrem přímo na verzi rutiny znakové sady MBCS, jako v následujícím příkladu z Tchar.h.
#define _tcschr _mbschr
Pokud zvolíte tento přístup, musíte být opatrní, abyste zajistili použití příslušných datových typů pro řetězcové argumenty a řetězcové návratové hodnoty.Můžete použít přetypování typů k zajištění správné shody typů nebo můžete použít datový typ obecného textu _TXCHAR._TXCHAR se mapuje na typ char v kódování SBCS, ale mapuje se na unsigned char v kódování MBCS.Pro další informace o makrech obecného textu si prohlédněte Mapování obecného textu v Run-Time Library Reference.