Uso de tipos de datos de TCHAR.H con código _MBCS
Cuando la constante de manifiesto _MBCS
se define, una rutina de texto genérico determinada se asigna a uno de los siguientes tipos de rutinas:
Una rutina de SBCS que controla cadenas, caracteres y bytes multibyte de forma adecuada. En este caso, se espera que los argumentos de cadena sean del tipo
char*
. Por ejemplo,_tprintf
se asigna aprintf
; los argumentos de cadena paraprintf
son de tipochar*
. Si usa el tipo de datos de texto genérico_TCHAR
para la cadena de tipos, los tipos de parámetros formales y reales paraprintf
coinciden porque_TCHAR*
se asigna achar*
.Una rutina específica de MBCS. En este caso, se espera que los argumentos de cadena sean del tipo
unsigned char*
. Por ejemplo,_tcsrev
se asigna a_mbsrev
, que espera y devuelve una cadena de tipounsigned char*
. Si usa el tipo de datos de texto genérico_TCHAR
para los tipos de cadena, hay un posible conflicto de tipos porque_TCHAR
se asigna al tipochar
.
A continuación se presentan tres soluciones para evitar este conflicto de tipos, así como las advertencias del compilador de C o errores del compilador de C++ que se generarían:
Usa el comportamiento predeterminado. TCHAR.H proporciona prototipos de rutinas de texto genérico para rutinas en las bibliotecas en tiempo de ejecución, como en el ejemplo siguiente.
char * _tcsrev(char *);
En el caso predeterminado, el prototipo de
_tcsrev
se asigna a_mbsrev
a través de un código thunk en Libc.lib. Esto cambia los tipos de los parámetros de entrada_mbsrev
y el valor devuelto de salida de_TCHAR*
(es decir,char *
) aunsigned char *
. Este método garantiza la coincidencia de tipos cuando se usa_TCHAR
, pero es relativamente lento debido a la sobrecarga de llamadas a la función.Use la inserción de funciones mediante la incorporación de la siguiente instrucción del preprocesador en el código.
#define _USE_INLINING
Este método genera un código thunk de la función insertada, proporcionado en TCHAR.H, para asignar la rutina de texto genérico directamente a la rutina de MBCS adecuada. El siguiente código de TCHAR.H proporciona un ejemplo de cómo hacerlo.
__inline char *_tcsrev(char *_s1) {return (char *)_mbsrev((unsigned char *)_s1);}
Si puede usar la inserción, es la mejor solución, ya que garantiza la coincidencia de tipos y no incurrir en ningún costo por tiempo adicional.
Use la asignación directa mediante la incorporación de la siguiente instrucción del preprocesador en el código.
#define _MB_MAP_DIRECT
Este enfoque proporciona una alternativa rápida si no desea usar el comportamiento predeterminado o si no se puede usar la inserción. Ocasiona que una macro asigne la rutina de texto genérico directamente a a la versión de MBCS de la rutina, como en el siguiente ejemplo de TCHAR.H.
#define _tcschr _mbschr
Cuando adopta este enfoque, debe asegurarse de que se utilizan tipos de datos apropiados para argumentos de cadena y valores devueltos de cadena. Puede usar la conversión de tipos para garantizar la coincidencia correcta de tipos o puede usar el tipo de datos de texto genérico
_TXCHAR
._TXCHAR
se asigna al tipochar
en el código de SBCS, pero se asigna al tipounsigned char
en el código de MBCS. Para obtener más información sobre las macros de texto genérico, consulte Asignaciones de texto genérico en la Referencia de la biblioteca en tiempo de ejecución.