Asignaciones de texto genérico en tchar.h
Para simplificar el transporte de código para uso internacional, la biblioteca en tiempo de ejecución de Microsoft proporciona asignaciones de texto genérico específicas de Microsoft para muchos tipos de datos, rutinas y otros objetos. Se pueden usar estas asignaciones, que se definen en tchar.h, para crear código genérico que se puede compilar para juegos de caracteres de un solo byte, multibyte o Unicode, en función de una constante de manifiesto que se define con una instrucción #define
. Las asignaciones de texto genérico son extensiones de Microsoft que no son compatibles con ANSI.
Con tchar.h, se pueden compilar aplicaciones de un solo byte, de juego de caracteres multibyte (MBCS) y Unicode a partir de los mismos códigos fuente. tchar.h define macros (que tienen el prefijo _tcs
) que, con las definiciones de preprocesador correctas, se asignan a las funciones str
, _mbs
o wcs
, según proceda. Para compilar MBCS, se ha de definir el símbolo _MBCS
. Para compilar Unicode, defina el símbolo _UNICODE
. Para compilar una aplicación de un solo byte, no hay que definir ningún símbolo (opción predeterminada). De forma predeterminada, _UNICODE
está definido para aplicaciones MFC.
El tipo de datos _TCHAR
se define de forma condicional en tchar.h. Si se ha definido el símbolo _UNICODE
para la compilación, _TCHAR
se define como wchar_t
; en caso contrario, para compilaciones MBCS y de un solo byte, se define como char
. (wchar_t
, el tipo de datos básico de caracteres anchos Unicode, es el equivalente de 16 bits de un signed char
de 8 bits). En el caso de las aplicaciones internacionales, use la familia de funciones _tcs
, que funcionan en unidades _TCHAR
, no bytes. Por ejemplo, _tcsncpy
copia n
_TCHARs
, no n
bytes.
Dado que algunas funciones de control de cadenas de juego de caracteres de byte único (SBCS) reciben parámetros char*
(con signo), se genera una advertencia del compilador indicando que el tipo no coincide cuando se define _MBCS
. Hay tres formas de evitar esta advertencia:
Usar código thunk de función insertada con seguridad de tipos en tchar.h. Este es el comportamiento predeterminado.
Usar las macros directas en tchar.h mediante la definición de
_MB_MAP_DIRECT
en la línea de comandos. Si lo hace, deberá hacer coincidir los tipos manualmente. Este es el método más rápido, pero no garantiza la seguridad de tipos.Usar código thunk de función de biblioteca vinculada estáticamente con seguridad de tipos en tchar.h. Para ello, defina la constante
_NO_INLINING
en la línea de comandos. Este es el método más lento, pero garantiza prácticamente la seguridad de tipos.
Directivas de preprocesador para asignaciones de texto genérico
# define | Versión compilada | Ejemplo |
---|---|---|
_UNICODE |
Unicode (carácter ancho) | _tcsrev se asigna a _wcsrev |
_MBCS |
Carácter multibyte | _tcsrev se asigna a _mbsrev |
Ninguno (la opción predeterminada no tiene definidos _UNICODE ni _MBCS ) |
SBCS (ASCII) | _tcsrev se asigna a strrev |
Por ejemplo, la función de texto genérico _tcsrev
, definida en tchar.h, se asigna a _mbsrev
si se ha definido _MBCS
en el programa, o a _wcsrev
si se ha definido _UNICODE
. De lo contrario, _tcsrev
se asigna a strrev
. En tchar.h se proporcionan otras asignaciones de tipo de datos para mayor comodidad en la programación, pero _TCHAR
es la más útil.
Asignaciones de tipos de datos de texto genérico
Texto genérico Nombre de tipo de datos |
_UNICODE & _MBCS no definidos |
_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 o _TEXT |
Sin efecto (quitado por el preprocesador) | Sin efecto (quitado por el preprocesador) | L (convierte el carácter o la cadena siguiente en su equivalente de Unicode) |
Para obtener una lista de asignaciones de texto genérico de rutinas, variables y otros objetos, vea Asignaciones de texto genérico en la referencia de la biblioteca en tiempo de ejecución.
Nota:
No utilice la familia str
de funciones con cadenas de Unicode, ya que probablemente contendrán bytes nulos incrustados. Del mismo modo, no use la familia de funciones wcs
con cadenas MBCS (o SBCS).
Los siguientes fragmentos de código muestran el uso de _TCHAR
y _tcsrev
para la asignación a los modelos MBCS, Unicode y SBCS.
_TCHAR *RetVal, *szString;
RetVal = _tcsrev(szString);
Si se ha definido _MBCS
, el preprocesador asigna este fragmento a este código:
char *RetVal, *szString;
RetVal = _mbsrev(szString);
Si se ha definido _UNICODE
, el preprocesador asigna este fragmento a este código:
wchar_t *RetVal, *szString;
RetVal = _wcsrev(szString);
Si no se han definido _MBCS
ni _UNICODE
, el preprocesador asigna el fragmento a código ASCII de byte único, como sigue:
char *RetVal, *szString;
RetVal = strrev(szString);
Por lo tanto, se puede crear, mantener y compilar un único archivo de código fuente para su ejecución con rutinas específicas de cualquiera de los tres tipos de juegos de caracteres.
Consulte también
Texto y cadenas
Uso de tipos de datos de TCHAR.H con código _MBCS