Обработка TCHAR в заголовочных файлах для библиотек с разными наборами символов

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

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть проект, который использует две сторонние библиотеки, обе из которых используют TCHAR в своих заголовочных файлах. К сожалению, одна библиотека собрана как многобайтовая (назовите ее библиотекой a), а другая - на Unicode (назовите ее библиотекой b).

Теперь, насколько я понимаю, TCHAR заменяется прекомпилятором на wchar или char в зависимости от параметров сборки. Поэтому, когда библиотека a была скомпилирована, любой метод, который принимает параметр типа TCHAR, был настроен на ожидание параметра типа char, а методы в библиотеке b настроены на ожидание параметра типа wchar.

К сожалению, мое приложение-потребитель тоже должно выбрать набор символов. Если я выберу Unicode, то файл заголовка, который я включил для библиотеки a, скажет мне, что метод хочет wchar, потому что когда я компилирую TCHAR в заголовке, они интерпретируются как wchars. Это включает в себя TCHARS, определенные внутри структур. Я подтвердил это на практике, когда я выделяю и передаю буфер TCHAR, я получаю обратно мусор, потому что он заполняет мой буфер wchar многобайтовыми данными.

Мои вопросы: есть ли чистый способ использовать обе эти библиотеки в одном приложении? Возможно, я что-то не так делаю с тем, как я использую эти библиотеки?

Это было полезно?

Решение

Предполагая, что вы не используете слишком много классов / функций ни в одной из этих библиотек, я бы полностью обернул одну из библиотек. Допустим, если вы решили использовать mbc в своем приложении и обернуть библиотеку b (unicode), ваш заголовочный файл оболочки может использовать wchar_t вместо TCHAR , поэтому #define не повлияет на ваш интерфейс. Внутри cpp-файла вашей оболочки, где вы #include заголовки библиотеки b, вы #define TCHAR сопоставляете библиотеку b. Никакой другой код, кроме вашей оболочки, не должен быть доступен для просмотра библиотеки b.

Если вы используете несколько классов / функций в обеих этих библиотеках, поддержание кода оболочки быстро станет отдельной проблемой.

Другие советы

As Shing Yip предложено, лучше оберните разницу в свой собственный API. Это делает ваш исходный код независимым от него.

Затем API-интерфейс для преобразования должен преобразовывать символы из вашей кодировки в библиотеку. В Windows у вас есть функции, которые называются WideCharToMultiByte и тому подобное.

Я думаю, что ваш лучший вариант - это выбрать либо библиотеку a, либо библиотеку b (в нашем примере - библиотеку a). И затем, когда вы включаете заголовочные файлы библиотеки b, убедитесь, что вы # define / # undef независимо от того, с какой библиотекой b была скомпилирована. Затем вы должны убедиться, что вы конвертируете между библиотекой a и библиотекой b каждый раз, когда они используют одни и те же данные.

Было бы лучше, если бы вы могли собрать их таким же образом. В противном случае это будет очень грязно.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top