Compartir a través de


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:

  1. Usar código thunk de función insertada con seguridad de tipos en tchar.h. Este es el comportamiento predeterminado.

  2. 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.

  3. 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 y
_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