【问题标题】:How to deal with: redeclaration of C++ built-in type ‘char16_t’如何处理:重新声明C++内置类型‘char16_t’
【发布时间】:2014-06-23 15:11:37
【问题描述】:

在 C++11 项目中,我必须使用外部 C 库。这个库主头文件定义了

typedef uint16_t        char16_t;  

因此,包含此库的 C++ 程序的编译失败,并显示以下消息:

redeclaration of C++ built-in type ‘char16_t’

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

编辑:

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

【问题讨论】:

  • C++0x11。我还没听说过。
  • @ParkYoung-Bae: en.wikipedia.org/wiki/C%2B%2B17 ;)
  • 不知道#define在你眼里是不是懂事...
  • @PlasmaHH C++17 如何匹配C++0x11 模式?不过它匹配C++1y。 OP 的意思是C++0x == C++11
  • @PlasmaHH 哦,我的天哪... touché。那个很好。我必须使用更浓的咖啡。

标签: c++ c c++11 compiler-errors


【解决方案1】:

您可以使用宏重命名库类型,同时使其与新语言类型无关char16_t

#define char16_t LIBRARY_char16_t
#include <library>
#undef char16_t

然后,库头将在您的代码库中编译,因此 typedef 的名称为 LIBRARY_char16_t

库本身仍然被编译,因此所讨论的类型被 typedef'ed 为uint16_t,因此您不应尝试更改它(例如通过删除 typedef)以保持与编译库的二进制兼容。

【讨论】:

  • 经验不足(是的,我也在做这样的黑客攻击)我建议您创建自己的标题,然后始终包含该标题。这样你也准备好迎接更多的惊喜。
  • 我从没想过我会为拥有预处理器而高兴。
  • 是的@PlasmaHH,这确实是下一步。新标头应具有完全相同的名称,但它们的目录在INCLUDE_PATH 中应具有更高的优先级,这样您就不必更改代码库中的任何文件。
【解决方案2】:

C++11 将 char32_t 和 char16_t 定义为内置类型。仅当您使用 C++11 时才会发生此错误。即在您的 Application.mk 文件中,您拥有:

APP_CPPFLAGS += -std=c++11

您可以删除对 C++11 的支持,使用以下解决方法,这可能应该是官方 Android 源代码的一部分(如果还没有的话)。

在文件 /frameworks/native/include/utils/Unicode.h

#if __cplusplus <= 199711L
typedef uint32_t char32_t;
typedef uint16_t char16_t;
#endif

这是基于a question about char16/32_t with C++11的回答

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 2013-04-04
    • 2018-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多