处理具有不同字符集的库的头文件中的TCHAR

时间:2009-05-02 01:15:03

标签: c++ libraries tchar

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

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

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

我的问题是:是否有一种干净的方法可以在同一个应用程序中使用这两个库?我可能在使用这些库时遇到了什么问题吗?

3 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

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

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