Gestione dei TCHAR nei file di intestazione per librerie con set di caratteri diversi

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ho un progetto che utilizza due librerie di terze parti, entrambe le quali fanno uso di TCHAR nei loro file di intestazione. Sfortunatamente una libreria è rispettata come multi-byte (chiamala libreria a) e l'altra è compilata come Unicode (chiamala libreria b).

Ora capisco che TCHAR è sostituito dal precompilatore con wchar o char a seconda delle opzioni di compilazione. Pertanto, quando la libreria a è stata compilata, qualsiasi metodo che accetta un parametro di tipo TCHAR è stato impostato in modo da prevedere un parametro di tipo char e i metodi nella libreria b sono impostati in modo da prevedere un parametro di tipo wchar.

Purtroppo anche la mia applicazione di consumo deve scegliere un set di caratteri. Se scelgo Unicode, il file di intestazione che ho incluso per la libreria mi dice che il metodo vuole un wchar, perché quando compilo i TCHAR nell'intestazione vengono interpretati come wchars. Ciò include TCHAR definiti all'interno delle strutture. Ho confermato questo comportamento in pratica, quando allocare e passare un buffer TCHAR ottengo la spazzatura perché riempie il mio buffer wchar di dati multi-byte.

Le mie domande sono: esiste un modo semplice per utilizzare entrambe queste librerie nella stessa applicazione? Sto forse facendo qualcosa di sbagliato nel modo in cui sto usando queste librerie?

È stato utile?

Soluzione

Supponendo che tu non stia usando troppe classi / funzioni in nessuna di queste librerie, avvolgo completamente una delle librerie. Supponiamo che se hai deciso di utilizzare mbc nella tua app e di avvolgere la libreria b (unicode), il file di intestazione del wrapper può utilizzare wchar_t invece di TCHAR in modo che #define non influisca sul tuo interfaccia. All'interno del file cpp del wrapper in cui # include le intestazioni della libreria b, #define TCHAR per abbinare la libreria b. Nessun codice diverso dal wrapper dovrebbe essere autorizzato a visualizzare la libreria b.

Se si utilizzano più di alcune classi / funzioni in entrambe queste librerie, la manutenzione del codice wrapper diventerà rapidamente un problema a sé stante.

Altri suggerimenti

As Shing Yip suggerito, meglio racchiudere la differenza in un'API personale. Questo rende il codice sorgente indipendente da esso.

L'API di wrapping deve quindi convertire i caratteri dalla codifica a quella della libreria. Su Windows, ho funzioni chiamate WideCharToMultiByte e simili.

Penso che la tua migliore opzione sia quella di scegliere la libreria a o la libreria b (per questo esempio diremo la libreria a). E poi quando includi i file di intestazione della libreria b, assicurati di # define / # undef qualunque sia la libreria b compilata. Quindi devi assicurarti di convertire tra la libreria a e la libreria b ogni volta che usano gli stessi dati.

Sarebbe davvero meglio se potessi compilarli allo stesso modo. Altrimenti sarà molto disordinato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top