Sdílet prostřednictvím


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 na printf; řetězcové argumenty, které printf mají být typu char*. Pokud pro typy řetězců použijete _TCHAR datový typ obecný-text, formální a skutečné typy parametrů pro printf shodu, protože _TCHAR* se mapuje na char*.

  • 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 typu unsigned 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 typ char.

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* (tj char *. ) na unsigned 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 typ char v kódu SBCS, ale mapuje se na typ unsigned char v kódu MBCS. Další informace o obecných textovýchmakch

Viz také

Mapování obecného textu v souboru tchar.h