2014-06-23 71 views
6

在C++ 11項目中,我必須使用外部C庫。該庫主頭文件定義如何處理:重新聲明C++內置類型'char16_t'

typedef uint16_t  char16_t; 

而且由於它的C++程序,其中包括該庫失敗,與消息的編譯:

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

我唯一的想法是重新包裝整個庫,但因爲char16_t在這個庫中是普遍的,所以它會非常耗時(如果可能的話)。有沒有一些明智的方法來處理這個問題?

編輯:

我還刪除有問題的線路,並與uint16_t更換char16_t的每一次出現,但我將不得不修改第三方庫頭,我特別不喜歡這個想法的另一個想法(可以有更類似的錯誤)。所以我也想知道在包含頭文件時,是否有一些好的方法來處理C++和C之間不兼容的更廣泛問題。

+2

'C++ 0x11'。我還沒有聽說過。 –

+3

@ ParkYoung-Bae:http://en.wikipedia.org/wiki/C%2B%2B17;) – PlasmaHH

+0

我不知道'#define'在你眼中是否明智...... – PlasmaHH

回答

12

你可以使用宏,同時保持它無關的新的語言類型char16_t重命名庫類型:

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

然後,庫頭會在你的代碼庫進行編譯,從而typedef的有名字LIBRARY_char16_t

庫本身仍然被編譯,使得所討論的類型被typedef化爲uint16_t,所以你不應該嘗試改變它(例如去除typedef)以保持與編譯庫二進制兼容。

+2

出於經驗(是的,我也在做這樣的黑客攻擊)我建議創建自己的頭部,然後永遠包含頭部。這樣你也準備了更多的驚喜。 – PlasmaHH

+0

我從來沒有想過我會爲預處理器感到高興。 – Trismegistos

+0

是的@PlasmaHH這將確實是下一步。新的頭文件應該具有完全相同的名稱,但是它們的目錄應該在'INCLUDE_PATH'中具有更高的優先級,這樣您就不必更改代碼庫中的任何*文件。 – leemes

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