Udostępnij za pośrednictwem


Używanie typów danych TCHAR.H z kodem _MBCS

Gdy stała _MBCS manifestu jest zdefiniowana, dana rutyna tekstu ogólnego mapuje na jeden z następujących rodzajów procedur:

  • Rutyna SBCS, która odpowiednio obsługuje bajty, znaki i ciągi wielobajtowe. W takim przypadku argumenty ciągu powinny mieć typ char*. Na przykład _tprintf mapuje na printf; argumenty ciągu do printf mają typ char*. Jeśli używasz _TCHAR typu danych ogólnego tekstu dla typów ciągów, typy parametrów formalnych i rzeczywistych dla printf dopasowania, ponieważ _TCHAR* mapuje na char*wartość .

  • Rutyna specyficzna dla MBCS. W takim przypadku argumenty ciągu powinny mieć typ unsigned char*. Na przykład _tcsrev mapuje wartość , _mbsrevktóra oczekuje i zwraca ciąg typu unsigned char*. Jeśli używasz _TCHAR typu danych ogólnego tekstu dla typów ciągów, istnieje potencjalny konflikt typu, ponieważ _TCHAR mapuje na typ char.

Poniżej przedstawiono trzy rozwiązania uniemożliwiające konflikt tego typu (oraz ostrzeżenia kompilatora języka C lub błędy kompilatora C++, które mogłyby spowodować):

  • Użyj domyślnego zachowania. tchar.h udostępnia prototypy procedur ogólnych tekstu dla procedur w bibliotekach czasu wykonywania, jak w poniższym przykładzie.

    char * _tcsrev(char *);
    

    W domyślnym przypadku prototyp _tcsrev mapowania przez _mbsrev thunk w Libc.lib. Spowoduje to zmianę _mbsrev typów parametrów przychodzących i wychodzącej wartości zwracanej z _TCHAR* (czyli char *) na unsigned char *. Ta metoda zapewnia dopasowanie typu w przypadku używania _TCHARmetody , ale jest stosunkowo niska z powodu obciążenia wywołania funkcji.

  • Użyj wznawiania funkcji, dołączając następującą instrukcję preprocesora w kodzie.

    #define _USE_INLINING
    

    Ta metoda powoduje, że funkcja śródliniowa thunk, podana w tchar.h, mapuje procedurę ogólnego tekstu bezpośrednio na odpowiednią procedurę MBCS. Poniższy fragment kodu z pliku tchar.h zawiera przykład tego, jak to zrobić.

    __inline char *_tcsrev(char *_s1)
    {return (char *)_mbsrev((unsigned char *)_s1);}
    

    Jeśli możesz użyć inliningu, jest to najlepsze rozwiązanie, ponieważ gwarantuje dopasowanie typu i nie ma dodatkowych kosztów czasowych.

  • Użyj bezpośredniego mapowania, dołączając następującą instrukcję preprocesora w kodzie.

    #define _MB_MAP_DIRECT
    

    Takie podejście zapewnia szybką alternatywę, jeśli nie chcesz używać domyślnego zachowania lub nie można użyć wpinania. Powoduje to mapowanie procedury ogólnego tekstu przez makro bezpośrednio do wersji MBCS procedury, jak w poniższym przykładzie z tchar.h.

    #define _tcschr _mbschr
    

    W przypadku stosowania tego podejścia należy zachować ostrożność, aby zapewnić użycie odpowiednich typów danych dla argumentów ciągów i zwracanych wartości ciągu. Możesz użyć rzutowania typów, aby zapewnić odpowiednie dopasowanie typu lub użyć _TXCHAR typu danych tekstowych ogólnych. _TXCHAR mapuje na typ char kodu SBCS, ale mapuje na typ unsigned char w kodzie MBCS. Aby uzyskać więcej informacji na temat makr ogólnych tekstu, zobacz Ogólne mapowania tekstu w dokumentacji biblioteki czasu wykonywania.

Zobacz też

Mapowania typu ogólny-tekst w pliku tchar.h