Partilhar via


Generic-Text Mapeamentos em tchar.h

Para simplificar o transporte de código para uso internacional, a biblioteca de tempo de execução da Microsoft fornece mapeamentos de texto genérico específicos da Microsoft para muitos tipos de dados, rotinas e outros objetos. Você pode usar esses mapeamentos, que são definidos em tchar.h, para escrever código genérico que pode ser compilado para conjuntos de caracteres de byte único, multibyte ou Unicode, dependendo de uma constante de manifesto que você deve definir usando a instrução #define. Mapeamentos de texto genérico são extensões da Microsoft que não são compatíveis com ANSI.

Usando o tchar.h, pode construir aplicações de byte único, de Conjunto de Caracteres Multibyte (MBCS) e Unicode a partir das mesmas fontes. tchar.h define macros (que têm o prefixo _tcs) que, com as definições do pré-processador adequadas, mapeiam para str, _mbs ou wcs funções, conforme apropriado. Para criar o MBCS, defina o símbolo _MBCS. Para criar Unicode, defina o símbolo _UNICODE. Para criar um aplicativo de byte único, não defina nenhum dos dois (o padrão). Por padrão, _UNICODE é definido para aplicativos MFC.

O _TCHAR tipo de dados é definido condicionalmente em tchar.h. Se o símbolo _UNICODE é definido para sua compilação, _TCHAR é definido como wchar_t; caso contrário, para compilações de byte único e MBCS, ele é definido como char. (wchar_t, o tipo de dados de caracteres largos Unicode básico, é a contraparte de 16 bits para um 8 bits signed char.) Para aplicações internacionais, use a família de funções _tcs, que operam em unidades de _TCHAR, não em bytes. Por exemplo, _tcsncpy copia n_TCHARs, não n bytes.

Como algumas funções de manipulação de cadeia de caracteres SBCS (Single Byte Character set) usam parâmetros (assinados), char* um aviso de compilador de incompatibilidade de tipo resulta quando _MBCS é definido. Há três maneiras de evitar esse aviso:

  1. Utilize as funções inline seguras de tipo (type-safe) em tchar.h. Este é o comportamento padrão.

  2. Utilize as macros diretas em tchar.h definindo _MB_MAP_DIRECT na linha de comando. Se fizeres isso, tens de corresponder manualmente os tipos. Este é o método mais rápido, mas não é tipo seguro.

  3. Use a função de biblioteca vinculada estaticamente segura para tipos thunks em tchar.h. Para fazer isso, defina a constante _NO_INLINING na linha de comando. Este é o método mais lento, mas o mais seguro para tipos.

Diretivas de pré-processador para mapeamentos de Generic-Text

# definir Versão compilada Exemplo
_UNICODE Unicode (caractere largo) _tcsrev mapeia para _wcsrev
_MBCS Caractere multibyte _tcsrev mapeia para _mbsrev
Nenhum (o padrão não tem nem _UNICODE nem _MBCS definido) SBCS (ASCII) _tcsrev mapeia para strrev

Por exemplo, a função _tcsrevde texto genérico , que é definida em tchar.h, mapeia para _mbsrev se você definiu _MBCS em seu programa, ou para _wcsrev se você definiu _UNICODE. Caso contrário, _tcsrev mapeia para strrev. Outros mapeamentos de tipo de dados são fornecidos em tchar.h para conveniência de programação, mas _TCHAR é o mais útil.

Mapeamentos de tipo de dados Generic-Text

Generic-Text
Nome do tipo de dados
_UNICODE &
_MBCS Não definido
_MBCS
Definido
_UNICODE
Definido
_TCHAR char char wchar_t
_TINT int unsigned int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T ou _TEXT Sem efeito (removido pelo pré-processador) Sem efeito (removido pelo pré-processador) L (converte o seguinte caractere ou cadeia de caracteres em sua contraparte Unicode)

Para obter uma lista de mapeamentos de texto genérico de rotinas, variáveis e outros objetos, consulte MapeamentosGeneric-Text na Referência da Biblioteca Run-Time.

Observação

Não use a str família de funções com cadeias de caracteres Unicode, que provavelmente conterão bytes nulos incorporados. Da mesma forma, não use a wcs família de funções com cadeias de caracteres MBCS (ou SBCS).

Os fragmentos de código a seguir ilustram o uso de _TCHAR e _tcsrev para mapeamento para os modelos MBCS, Unicode e SBCS.

_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);

Se _MBCS tiver sido definido, o pré-processador mapeia este fragmento para este código:

char *RetVal, *szString;
RetVal = _mbsrev(szString);

Se _UNICODE tiver sido definido, o pré-processador mapeia este fragmento para este código:

wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);

Se nem _MBCS nem _UNICODE tiverem sido definidos, o pré-processador mapeia o fragmento para o código ASCII de byte único, da seguinte forma:

char *RetVal, *szString;
RetVal = strrev(szString);

Portanto, você pode escrever, manter e compilar um arquivo de código-fonte único para ser executado com rotinas específicas para qualquer um dos três tipos de conjuntos de caracteres.

Ver também

Texto e cadeias de caracteres
Usando tipos de dados do TCHAR.H com código _MBCS