Manejo de TCHAR en archivos de encabezado para bibliotecas con diferentes juegos de caracteres

StackOverflow https://stackoverflow.com/questions/813898

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo un proyecto que utiliza dos bibliotecas de terceros, que utilizan TCHAR en sus archivos de encabezado. Desafortunadamente, una biblioteca se cumple como varios bytes (llámela biblioteca a), y la otra se compila como Unicode (llámese biblioteca b).

Ahora entiendo que es que TCHAR es reemplazado por el precompilador con wchar o char dependiendo de las opciones de compilación. Entonces, cuando se compiló la biblioteca a, cualquier método que toma un parámetro de tipo TCHAR se configuró para esperar un parámetro de tipo char, y los métodos en la biblioteca b se configuraron para esperar un parámetro de tipo wchar.

Lamentablemente, mi aplicación de consumo también tiene que elegir un conjunto de caracteres. Si elijo Unicode, el archivo de encabezado que he incluido para la biblioteca a me dice que el método quiere un wchar, porque cuando compilo los TCHAR en el encabezado se interpretan como wchars. Esto incluye TCHARS definidos dentro de las estructuras. He confirmado este comportamiento en la práctica, cuando asigno y paso un búfer TCHAR, recibo basura porque llena mi búfer wchar con datos de varios bytes.

Mis preguntas son: ¿Hay una manera limpia de consumir ambas bibliotecas en la misma aplicación? ¿Tal vez estoy haciendo algo mal con la forma en que uso estas bibliotecas?

¿Fue útil?

Solución

Suponiendo que no esté usando demasiadas clases / funciones en ninguna de estas bibliotecas, envolvería una de las bibliotecas por completo. Supongamos que si decidió usar mbc en su aplicación y ajustar la biblioteca b (unicode), su archivo de encabezado de contenedor puede usar wchar_t en lugar de TCHAR para que #define no afecte a su interfaz. Dentro del archivo cpp de su contenedor donde #incluye los encabezados de la biblioteca b, #define TCHAR para que coincida con la biblioteca b. No se debe permitir que otro código que no sea su contenedor vea la biblioteca b.

Si está utilizando más de unas pocas clases / funciones en ambas bibliotecas, mantener el código contenedor rápidamente se convertirá en un problema propio.

Otros consejos

Como Shing Yip sugerido, mejor ajuste la diferencia en una API propia. Esto hace que su código fuente sea independiente de él.

La API de ajuste tiene que convertir los caracteres de su codificación a los de la biblioteca. En Windows, tengo funciones llamadas WideCharToMultiByte y similares.

Creo que su mejor opción es elegir la forma de hacerlo de biblioteca a o biblioteca b (diremos biblioteca a para este ejemplo). Y luego, cuando incluya archivos de encabezado de biblioteca b, asegúrese de # definir / # undef con qué biblioteca b se compiló. Luego debe asegurarse de convertir entre la biblioteca a y la biblioteca b cada vez que usen los mismos datos.

Sería realmente mejor si pudieras compilarlos de la misma manera. De lo contrario, será muy complicado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top