Compartilhar via


Usar tipos de dados TCHAR.H com código _MBCS

Quando o manifesto constante _MBCS é definida, uma determinada rotina texto genérico mapeia para um dos seguintes tipos de rotinas:

  • Uma rotina SBCS que manipula adequadamente bytes multibyte, caracteres e seqüências de caracteres.In this case, the string arguments are expected to be of type char*.Por exemplo, _tprintf mapeia para printf; os argumentos de seqüência de caracteres printf são do tipo char *.Se você usar o _TCHAR tipo de dados de texto genérica para seus tipos de seqüência de caracteres, tipos de parâmetro formal e real para printf Coincidir porque _TCHAR* maps to char *.

  • Uma rotina específica MBCS.In this case, the string arguments are expected to be of type unsigned char*.For example, _tcsrev maps to _mbsrev, which expects and returns a string of type unsigned char*.Se você usar o _TCHAR tipo de dados de texto genérica para seus tipos de seqüência de caracteres, há a um conflito de tipo potencial porque _TCHAR mapeia digite char.

A seguir estão três soluções para evitar esse conflito de tipo (e os avisos do compilador C ou erros do compilador C++ que possam resultar):

  • Use o comportamento padrão.Tchar.h fornece texto genérico rotina protótipos para rotinas na em time de execução bibliotecas, sistema autônomo no exemplo a seguir.

    char * _tcsrev(char *);
    

    No caso padrão, o protótipo para _tcsrev mapeia para _mbsrev por meio de uma conversão em libc.lib. This changes the types of the _mbsrev incoming parameters and outgoing return value from _TCHAR * (that is, char *) to unsigned char *.Esse método garante tipo correspondência quando você estiver usando _TCHAR, mas é relativamente lento devido à sobrecarga de telefonar de função.

  • Use a função inlining incorporando a demonstrativo seguinte pré-processador no seu código.

    #define _USE_INLINING
    

    Esse método faz com que uma conversão de função in-line, fornecido no tchar.h para mapear a rotina de texto genérica diretamente para a rotina MBCS apropriada.O seguinte trecho de código de tchar.h fornece um exemplo de como fazer isso.

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

    Se você pode usar inlining, isso é a melhor solução, porque ele garante digite correspondência e custou sem time adicional.

  • Use o mapeamento direto, incorporando a demonstrativo seguinte pré-processador no seu código.

    #define _MB_MAP_DIRECT
    

    Essa abordagem fornece uma alternativa rápida se você não quiser usar o comportamento padrão ou não é possível usar inlining.Ela faz com que a rotina de texto genérica a serem mapeados por uma macro diretamente para a versão de rotina, sistema autônomo no exemplo a seguir do tchar.h MBCS.

    #define _tcschr _mbschr
    

    Quando você faz essa abordagem, você deve ter cuidado para garantir o uso de tipos de dados apropriados para argumentos de seqüência de caracteres e valores de retorno de seqüência de caracteres.Você pode usar a conversão de tipo para garantir a correspondência de tipo adequado ou você pode usar o _TXCHARtipo de dados de texto genérica ._TXCHAR maps to type char in SBCS code but maps to type unsigned char in MBCS code.Para obter mais informações sobre macros de texto genérico, consulte Mapeamentos de texto genérica in the Referência da biblioteca de time de execução.

Consulte também

Conceitos

Mapeamentos de texto genérica na tchar.h