3

我有一个使用两个第三方库的项目,这两个库都在其头文件中使用了 TCHAR。不幸的是,一个库被编译为多字节(称为库 a),而另一个库被编译为 Unicode(称为库 b)。

现在我理解它的方式是 TCHAR 被预编译器替换为 wchar 或 char 取决于构建选项。因此,当编译库 a 时,任何采用 TCHAR 类型参数的方法都被设置为期望 char 类型的参数,而库 b 中的方法被设置为期望 wchar 类型的参数。

不幸的是,我的消费应用程序也必须选择一个字符集。如果我选择 Unicode,那么我为库 a 包含的头文件告诉我该方法需要一个 wchar,因为当我在头中编译 TCHAR 时,它们被解释为 wchar。这包括在结构内部定义的 TCHARS。我已经在实践中确认了这种行为,当我分配并传递一个 TCHAR 缓冲区时,我得到了垃圾,因为它用多字节数据填充了我的 wchar 缓冲区。

我的问题是:有没有一种干净的方法可以在同一个应用程序中使用这两个库?我在使用这些库的方式上可能做错了吗?

4

3 回答 3

4

假设您没有在这些库中的任何一个中使用太多类/函数,我将完全包装其中一个库。假设您决定在您的应用程序中使用 mbc 并包装库 b(unicode),则可以使用您的包装器头文件wchar_t而不是TCHAR这样 #define 不会影响您的界面。在您的包装器的 cpp 文件中,您 #include 库 b 的标头,您 #defineTCHAR以匹配库 b。不应允许除您的包装器之外的任何代码查看库 b。

如果您在这两个库中使用多个类/函数,那么维护包装器代码将很快成为其自身的问题。

于 2009-05-02T03:04:40.223 回答
1

正如成业建议的那样,最好将差异包装在您自己的 API 中。这使您的源代码独立于它。

The wrapping API then has to convert characters from your encoding to the library's. On windows, I you have functions called WideCharToMultiByte and the like.

于 2009-05-02T04:29:54.137 回答
0

我认为您最好的选择是选择库 a 或库 b(我们将在此示例中使用库 a)来执行此操作。然后,当您包含库 b 头文件时,请确保 #define/#undef 无论库 b 是用什么编译的。然后,您必须确保在库 a 和库 b 使用相同数据时进行转换。

如果您能以相同的方式编译它们,那将是最好的。否则会很乱。

于 2009-05-02T01:28:43.777 回答