2009-05-02 8 views
3

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

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

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

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

ответ

4

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

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

+0

Спасибо за ваш ответ, это направление, в котором я склоняюсь. Я собираюсь выйти на конечность и спросить, что может быть глупым вопросом. В чем преимущество наличия оболочки или просто редактирования файла заголовка для библиотеки, чтобы он соответствовал скомпилированным определениям структур и экспортированных функций? Я представляю, что это в основном так же просто, как и поиск и замена TCHAR. Я упрощаю это? – MichaC

+0

xtofl указывает на одно преимущество ниже: вы можете конвертировать в и из нескольких байтов в обертке. Полагаю, меня больше интересует обратная связь о том, будет ли поиск/замена работать. – MichaC

+2

Замена TCHAR с char/wchar_t в файле заголовка библиотеки будет работать только до тех пор, пока вы замените ВСЕ их, включая файлы заголовков, включенные через #include в файлы заголовков библиотеки. Зависит от вашей библиотеки, которая может содержать некоторые стандартные/системные файлы. Другой недостаток - когда вы получаете новую версию библиотеки, что вы делаете?Поиск и замена снова? –

0

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

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

1

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

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

 Смежные вопросы

  • Нет связанных вопросов^_^