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 paraprintf
; os argumentos de cadeia de caracteres paraprintf
são do tipochar*
. 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 paraprintf
corresponde porque_TCHAR*
é mapeado parachar*
.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 tipounsigned 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 tipochar
.
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*
(comochar *
) paraunsigned 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 tipochar
no código SBCS mas é mapeado para o tipounsigned 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.