Usando TCHAR.Tipos de dados de h com _ MBCS do arquivo de código
Quando a constante de manifesto _ MBCS do arquivo é definida, uma determinada rotina de texto genérico é mapeado para um dos seguintes tipos de rotinas:
Uma rotina de SBCS lida com seqüências de caracteres e bytes multibyte apropriadamente. 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 tipos de tipo de dados de texto genérico para a seqüência de caracteres, os tipos de parâmetro formal e reais para printf correspondentes, pois _ TCHAR* mapeia para char *.
Uma rotina específica de MBCS. Nesse caso, os argumentos de seqüência de caracteres devem ser do tipo unsigned char *. Por exemplo, _tcsrev mapeia para _mbsrev, que espera e retorna uma seqüência de caracteres do tipo unsigned char *. Se você usar o _ TCHAR o tipo de dados de texto genérico para tipos de seqüência de caracteres, há a um possível conflito de tipo porque _ TCHAR mapas digitar char.
Estes são três soluções para evitar esse conflito de tipo (e os avisos do compilador c ou erros do compilador do C++ resultariam):
Use o comportamento padrão. TCHAR.h fornece o texto genérico protótipos de rotina para rotinas de 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 por meio de uma conversão em Libc.lib. Isso altera os tipos da _mbsrev parâmetros de entrada e saída retornam o valor de _ TCHAR * (ou seja, char *) para unsigned char *. Esse método garante o tipo de correspondência, quando você estiver usando _ TCHAR, mas é relativamente lento devido à sobrecarga de chamada de função.
Use a função inlining incorporando a seguinte instrução de pré-processamento no 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 de 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 custou sem tempo adicional.
Use o mapeamento direto, incorporando a seguinte instrução de pré-processamento 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. Ele faz com que a rotina de texto genérico seja mapeado por uma macro diretamente para a versão MBCS de rotina, como no exemplo a seguir do Tchar.h.
#define _tcschr _mbschr
Quando você usar essa abordagem, você deve ter cuidado para garantir o uso de tipos de dados apropriados para os argumentos de seqüência de caracteres e os valores de retorno de seqüência de caracteres. Você pode usar a conversão de tipo para garantir a correspondência do tipo correto ou você pode usar o _TXCHAR o tipo de dados de texto genérico. _TXCHAR mapas digitar char no código SBCS mas mapas digitar unsigned char no código MBCS. Para obter mais informações sobre macros de texto genérico, consulte Os mapeamentos de texto genérico na Referência da biblioteca de tempo de execução.