Compartilhar via


Usando TCHAR.H tipos de dados com código MBCS do arquivo

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

  • Uma rotina SBCS que manipula bytes multibyte, caracteres e seqüências de caracteres corretamente.Nesse caso, os argumentos de seqüência de caracteres devem ser do tipo char *.Por exemplo, _tprintf mapeia para printf; os argumentos de seqüência de caracteres para printf são do tipo char *.Se você usar o _TCHAR tipo de dados de texto genérico para a seqüência de tipos, os tipos de parâmetro formal e real para printf corresponder porque _TCHAR* mapeia para char *.

  • Uma rotina específica de MBCS.Nesse caso, os argumentos de seqüência de caracteres devem ser do tipo unsignedchar *.Por exemplo, _tcsrev mapeia para _mbsrev, que espera e retorna uma seqüência de caracteres do tipo unsignedchar *.Se você usar o _TCHAR tipo de dados de texto genérico para seus tipos de cadeia de caracteres, há um conflito de tipo potencial porque _TCHAR mapas digite char.

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

  • Use o comportamento padrão.TCHAR.h fornece protótipos de rotina de texto genérico para rotinas de bibliotecas de tempo de execução, como no exemplo a seguir.

    char * _tcsrev(char *);
    

    No caso padrão, o protótipo do _tcsrev mapeia para _mbsrev por meio de uma conversão em Libc.lib.Isso altera os tipos do _mbsrev parâmetros de entrada e saída retornam o valor de _TCHAR* (isto é, char***) para unsignedchar***.Esse método garante tipo correspondente quando você estiver usando _TCHAR, mas é relativamente lento devido à sobrecarga de chamada de função.

  • Use função inlining incorporando a seguinte instrução de pré-processamento em seu código.

    #define _USE_INLINING
    

    Este método faz uma conversão de função in-line, fornecido no Tchar.h para mapear a rotina de texto genérico diretamente para a rotina MBCS apropriada.O seguinte trecho de código do Tchar.h fornece um exemplo de como isso é feito.

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

    Se você pode usar inlining, esta é a melhor solução, pois ela garante digite correspondência e tem um custo sem tempo adicional.

  • Use mapeamento direto incorporando a seguinte instrução de pré-processamento em 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.Faz com que a rotina de texto genérico para ser mapeado por uma macro diretamente para a versão MBCS de rotina, como no exemplo a seguir do Tchar.h.

    #define _tcschr _mbschr
    

    Quando essa abordagem, você deve ter cuidado para garantir o uso de tipos de dados apropriados para argumentos de string e valores de retorno de string.Você pode usar a conversão de tipo para garantir a correspondência de tipo adequado ou você pode usar o _TXCHAR tipo de dados de texto genérico._TXCHAR mapas digite char no código SBCS mas mapas digite unsignedchar no código MBCS.Para obter mais informações sobre macros de texto genérico, consulte Mapeamentos de texto genérico na Referência de biblioteca de tempo de execução.

Consulte também

Conceitos

Mapeamentos de texto genérico em Tchar.h