Partilhar via


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

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

  • Uma rotina SBCS que lida com bytes, caracteres e cadeias de caracteres multibyte. Nesse caso, os argumentos de cadeia de caracteres devem ser do tipo char*. Por exemplo, _tprintf é mapeado para printf; os argumentos de cadeia de caracteres para printf são do tipo char*. Se você usar o _TCHAR tipo de dados de texto genérico para a cadeia de tipos, os tipos de parâmetro formal e real para printf corresponde porque _TCHAR* é mapeado para char*.

  • Uma rotina específica do MBCS. Nesse caso, os argumentos de cadeia de caracteres devem ser do tipo unsigned char*. Por exemplo, _tcsrev é mapeado para _mbsrev, que espera e retorna uma cadeia de caracteres do tipo unsigned char*. Se você usar o _TCHAR tipo de dados de texto genérico para seus tipos de cadeia de caracteres, há a um possível conflito de tipo porque _TCHAR é mapeado para o tipo 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 resultariam):

  • Use o comportamento padrão. tchar.h fornece protótipos de rotina 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 é mapeado para _mbsrev por meio de uma conversão em Libc.lib. Isso altera os tipos dos parâmetros de entrada _mbsrev e valores retornados de saída de _TCHAR* (como char *) para unsigned char *. Esse método garante o tipo que corresponde ao usar _TCHAR, mas é relativamente lenta devido à sobrecarga de chamada de função.

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

    #define _USE_INLINING
    

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

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

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

  • Use mapeamento direto incorporando a instrução de pré-processador a seguir 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 mapeadas por uma macro diretamente para a versão MBCS de rotina, como no exemplo a seguir do tchar.h.

    #define _tcschr _mbschr
    

    Ao adotar essa abordagem, você deve ter cuidado para garantir o uso dos tipos de dados apropriados para argumentos de cadeia de caracteres e para valores de retorno de cadeia de caracteres. Você pode usar a conversão de tipo para garantir a correspondência do tipo correto ou você pode usar o _TXCHAR tipo de dados de texto genérico. _TXCHAR é mapeado para o tipo char no código SBCS mas é mapeado para o tipo unsigned char no código MBCS. Para mais informações sobre macros de texto genérico, confira Mapeamentos de Texto Genérico na Referência da Biblioteca em Tempo de Execução.

Confira também

Mapeamentos de texto genérico em tchar.h