Partilhar via


Usando os tipos de dados TCHAR.H com o código _MBCS

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

  • Uma rotina SBCS que gere bytes, caracteres e sequências de caracteres multibyte de forma apropriada. Nesse caso, espera-se que os argumentos de cadeia de caracteres sejam do tipo char*. Por exemplo, _tprintf mapeia para printf; os argumentos de cadeia de caracteres para printf são do tipo char*. Se utilizar o tipo de dados de texto genérico _TCHAR para os seus tipos de cadeia de caracteres, os tipos de parâmetro formal e real para printf devem corresponder porque _TCHAR* mapeia para char*.

  • Uma rotina específica do MBCS. Nesse caso, espera-se que os argumentos de cadeia de caracteres sejam do tipo unsigned char*. Por exemplo, _tcsrev mapeia para _mbsrev, que espera e retorna uma cadeia de caracteres do tipo unsigned char*. Se utilizar o tipo de dados de texto genérico para os seus tipos de strings, existe um potencial conflito de tipo porque _TCHAR mapeia para o tipo _TCHARchar.

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

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

    char * _tcsrev(char *);
    

    No caso padrão, o protótipo para _tcsrev mapeia para _mbsrev através de um thunk em Libc.lib. Isso altera os tipos dos parâmetros de entrada _mbsrev e o valor de retorno de _TCHAR* (ou seja, char *) para unsigned char *. Esse método garante a correspondência de tipo quando você está usando _TCHAR, mas é relativamente lento devido à sobrecarga de chamada de função.

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

    #define _USE_INLINING
    

    Este método faz com que uma função embutida thunk, fornecida em tchar.h, mapeie a rotina de texto genérico diretamente para a rotina MBCS apropriada. O seguinte trecho de código de tchar.h fornece um exemplo de como isso é feito.

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

    Se puderes usar inlining, esta é a melhor solução, porque garante a compatibilidade de tipo e não tem custo de tempo adicional.

  • Use o mapeamento direto incorporando a seguinte instrução de pré-processador 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 puder usar o inlining. Isso faz com que a rotina de texto genérico seja mapeada por uma macro diretamente para a versão MBCS da rotina, como no exemplo a seguir de tchar.h.

    #define _tcschr _mbschr
    

    Ao adotar essa abordagem, você deve ter cuidado para garantir o uso de tipos de dados apropriados para argumentos de cadeia de caracteres e valores de retorno de cadeia de caracteres. Você pode usar a conversão de tipo para garantir a correspondência de tipo adequada ou pode usar o _TXCHAR tipo de dados de texto genérico. _TXCHAR associa-se ao tipo char no código SBCS, mas associa-se ao tipo unsigned char no código MBCS. Para obter mais informações sobre macros de texto genérico, consulte Mapeamentos deGeneric-Text na Referência de BibliotecaRun-Time.

Ver também

Generic-Text Mapeamentos em tchar.h