我有一个使用两个第三方库的项目,这两个库都在其头文件中使用了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。

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

其他提示

成业建议,更好地包装您自己的API的差异。这使您的源代码独立于它。

然后,包装API必须将编码中的字符转换为库的字符。在Windows上,我有一些名为 WideCharToMultiByte 等功能。

我认为你最好的选择是选择库a或库b(我们将在这个例子中说库a)这样做。然后,当您包含库b头文件时,请确保#define / #undef编译的库b。然后,您必须确保在使用相同数据的任何时候在库a和库b之间进行转换。

如果你能以同样的方式编译它们真的是最好的。否则它会非常混乱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top