Handhabung TCHARs in Header-Dateien für Bibliotheken mit unterschiedlichen Zeichensätzen

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

  •  03-07-2019
  •  | 
  •  

Frage

Ich habe ein Projekt, das zwei Bibliotheken von Drittanbietern verwendet, die beide der Verwendung von TCHARs in ihren Header-Dateien zu machen. Leider ist eine Bibliothek als Multi-Byte erfüllt (es nennen Bibliothek a), und die andere wird als Unicode (nennen wir es Bibliothek b) zusammengestellt.

Nun ist die Art, wie ich es verstehe, ist, dass TCHAR mit vom Precompiler ersetzt wird entweder wchar oder char auf den Build-Optionen abhängig. Also, wenn Bibliothek a wurde jede Methode zusammengestellt, die einen Parameter vom Typ TCHAR nimmt gesetzt wurde einen Parameter vom Typ char zu erwarten, und Methoden in der Bibliothek b einen Parameter des Typ wchar erwarten.

Leider ist meine raubend Anwendung hat einen Charakter zu setzen auszuwählen. Wenn ich Unicode wählen dann die Header-Datei I enthalten sind, für die Bibliothek ein mir sagt, dass das Verfahren eine wchar will, denn wenn ich die TCHARs im Header kompilieren sie als wchars interpretiert werden. Dazu gehören TCHARs innerhalb der Strukturen definiert ist. Ich habe dieses Verhalten in der Praxis bestätigt, wenn ich zuteilen und übergeben Sie einen TCHAR Puffer I Müll zurück, weil es meinen wchar Puffer mit Multi-Byte-Daten füllt.

Meine Fragen sind: Gibt es eine saubere Art und Weise dieser beiden Bibliotheken in derselben Anwendung zu konsumieren? Bin ich vielleicht etwas falsch machen mit, wie ich diese Bibliotheken verwendet werden?

War es hilfreich?

Lösung

Angenommen, Sie sind nicht zu viele Klassen / Funktion in einer dieser Bibliotheken, würde ich eine der Bibliothek wickelt vollständig. Nehmen wir an, wenn Sie sich entschieden MBC in Ihrer Anwendung zu verwenden und wickeln Bibliothek b (Unicode), Ihre Wrapper-Header-Datei wchar_t statt TCHAR verwenden können, so #define nicht Ihre Schnittstelle beeinflussen. In Ihrer CPP-Datei der Wrapper, wo Sie Bibliothek bs Header # include, #define Sie TCHAR Bibliothek b entsprechen. Kein anderer Code als Ihr Wrapper sollte Bibliothek b sehen erlaubt werden.

Wenn Sie mehr als ein paar Klasse / Funktion in beiden Bibliotheken sind, die Wrapper-Code beibehalten wird schnell ein Problem der eigenen werden.

Andere Tipps

Wie Shing Yip vorgeschlagen, besser den Unterschied in einer API der eigenen wickeln. Dies macht den Quellcode unabhängig davon.

Die Verpackung API hat dann Zeichen aus der Codierung in der Bibliothek zu konvertieren. Am Fenster, ich habe Sie Funktionen genannt WideCharToMultiByte und dergleichen.

Ich denke, die beste Wahl ist entweder Bibliothek ein oder Bibliothek b zu wählen (wir sagen Bibliothek eine für dieses Beispiel) Art und Weise tun. Und dann, wenn Sie Bibliothek b Header-Dateien enthalten, stellen Sie sicher, dass Sie # define / # undef, was auch immer Bibliothek b wurde mit erstellt. Dann müssen Sie sicherstellen, dass Sie zwischen Bibliothek ein und Bibliothek b jederzeit konvertieren verwenden sie die gleichen Daten.

Es wäre wirklich am besten, wenn man sich auf die gleiche Weise zusammengestellt werden könnte. Ansonsten geht es sehr chaotisch sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top