Compartir a través de


Utilizar 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 a printf; los argumentos de cadena para printf son de tipo char*. Si usa el tipo de datos de texto genérico _TCHAR para la cadena de tipos, los tipos de parámetros formales y reales para printf coinciden porque _TCHAR* se asigna a char*.

  • 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 tipo unsigned 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 tipo char.

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 *) a unsigned 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 tipo char en el código de SBCS, pero se asigna al tipo unsigned 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.

Consulte también

Asignaciones de texto genérico en tchar.h