如何处理:重新声明C++内置类型'char16_t'

Tri*_*tos 6 c c++ compiler-errors c++11

在C++ 11项目中,我必须使用外部C库.此库主头文件定义

typedef uint16_t        char16_t;  
Run Code Online (Sandbox Code Playgroud)

因为它包含这个库的C++程序的编译失败,消息:

redeclaration of C++ built-in type ‘char16_t’
Run Code Online (Sandbox Code Playgroud)

我唯一的想法是重新打包整个库,但因为char16_t在这个库中普遍存在,所以非常耗时(如果可能的话).是否有一些明智的方法来处理这个问题?

编辑:

我还有另一个想法是删除有问题的行并用uint16_t替换每个char16_t,但我必须修改第三方库头,我不是特别喜欢这个想法(可能有更多类似的错误).所以我也想知道在包含头文件时是否有一些处理C++和C之间不兼容问题的好方法.

lee*_*mes 13

您可以使用宏来重命名库类型,同时保持它与新语言类型无关char16_t:

#define char16_t LIBRARY_char16_t
#include <library>
#undef char16_t
Run Code Online (Sandbox Code Playgroud)

然后,库头将在您的代码库中编译,以便typedef具有名称LIBRARY_char16_t.

库本身仍然编译,有问题的类型Typedef的到uint16_t,所以你不应该试图以保持与编译库二进制兼容(去除的typedef例如通过),以改变这种状况.

  • 出于经验(是的,我也在做这样的黑客攻击)我建议你创建自己的标题,然后总是包括那个标题.这样你就可以为更多的惊喜做好准备. (2认同)