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

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

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

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

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

Ответы [ 3 ]

4 голосов
/ 02 мая 2009

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

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

1 голос
/ 02 мая 2009

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

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

0 голосов
/ 02 мая 2009

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

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

...