Použití datových typů TCHAR.H s kódováním _MBCS
Při definování konstanty _MBCS
manifestu se daná rutina obecného textu mapuje na jeden z následujících typů rutin:
Rutina SBCS, která odpovídajícím způsobem zpracovává vícebajtové bajty, znaky a řetězce. V tomto případě se očekává, že řetězcové argumenty budou typu
char*
. Například_tprintf
se mapuje naprintf
; řetězcové argumenty, kteréprintf
mají být typuchar*
. Pokud pro typy řetězců použijete_TCHAR
datový typ obecný-text, formální a skutečné typy parametrů proprintf
shodu, protože_TCHAR*
se mapuje nachar*
.Rutina specifická pro MBCS. V tomto případě se očekává, že řetězcové argumenty budou typu
unsigned char*
. Například mapuje na_tcsrev
_mbsrev
, který očekává a vrací řetězec typuunsigned char*
. Pokud pro typy řetězců používáte_TCHAR
datový typ obecný-text, je možné konflikt typu, protože_TCHAR
se mapuje na typchar
.
Následují tři řešení, která brání konfliktu tohoto typu (a upozornění kompilátoru jazyka C nebo chyby kompilátoru jazyka C++, které by to vedlo):
Použijte výchozí chování. tchar.h poskytuje prototypy rutin obecného textu pro rutiny v knihovnách za běhu, jak je znázorněno v následujícím příkladu.
char * _tcsrev(char *);
Ve výchozím případě prototyp mapuje
_tcsrev
_mbsrev
přes blok v knihovně Libc.lib. Tím se změní typy příchozích_mbsrev
parametrů a odchozí návratová hodnota z_TCHAR*
(tjchar *
. ) naunsigned char *
. Tato metoda zajišťuje porovnávání typů při použití_TCHAR
, ale je relativně pomalé kvůli režii volání funkce.Funkci inlining použijte zahrnutím následujícího příkazu preprocesoru do kódu.
#define _USE_INLINING
Tato metoda způsobí, že vložená funkce tchar.h, mapuje rutinu obecného textu přímo na příslušnou rutinu MBCS. Následující výňatek kódu z tchar.h poskytuje příklad toho, jak se to dělá.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
Pokud můžete použít vkládání, je to nejlepší řešení, protože zaručuje porovnávání typů a nemá žádné další časové náklady.
Přímé mapování použijte zahrnutím následujícího příkazu preprocesoru do kódu.
#define _MB_MAP_DIRECT
Tento přístup poskytuje rychlou alternativu, pokud nechcete používat výchozí chování nebo nemůžete použít inlining. Způsobí, že makro mapuje rutinu obecného textu přímo na verzi rutiny MBCS, jak je znázorněno v následujícím příkladu z tchar.h.
#define _tcschr _mbschr
Při použití tohoto přístupu musíte být opatrní, abyste zajistili použití vhodných datových typů pro řetězcové argumenty a návratové hodnoty řetězců. Přetypování typů můžete použít k zajištění správného porovnávání typů nebo můžete použít
_TXCHAR
datový typ obecného textu._TXCHAR
mapuje typchar
v kódu SBCS, ale mapuje se na typunsigned char
v kódu MBCS. Další informace o obecných textovýchmakch