2014-06-23 13 views
6

W projekcie C++ 11 muszę użyć zewnętrznej biblioteki C. Ta biblioteka główny plik nagłówka określaJak sobie poradzić: redeclaracja wbudowanego w C++ typu "char16_t"

typedef uint16_t  char16_t; 

A ponieważ to kompilacja programu C++, który obejmuje nie powiedzie tej biblioteki, z komunikatem:

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

Jedyny pomysł mam jest zapakowanie całą bibliotekę ale ponieważ char16_t jest wszechobecne w tej bibliotece, byłoby bardzo czasochłonne (jeśli to możliwe). Czy istnieją pewne rozsądne sposoby radzenia sobie z tym problemem?

Edit:

Mam też inny pomysł usuwania problematycznej linii i zastępując każde wystąpienie char16_t z uint16_t ale musiałbym modyfikować nagłówki biblioteki strona trzecia, a ja nie szczególnie lubię tego pomysłu (nie może być bardziej podobnymi błędami). Zastanawiam się również, czy istnieje jakiś dobry sposób radzenia sobie z szerszym problemem niezgodności między C++ i C, gdy zawiera nagłówki.

+2

'C++ 0x11'. Jeszcze tego nie słyszałem. –

+3

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

+0

Nie wiem, czy '# define' jest sensowne w twoich oczach ... – PlasmaHH

Odpowiedz

12

Można użyć makra, aby zmienić nazwę Type Library, jednocześnie utrzymując ją niezwiązane z nowym rodzajem języka char16_t:

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

Następnie nagłówek biblioteki zostaną skompilowane w swojej bazie kodu tak, że typedef ma nazwa LIBRARY_char16_t.

Sama biblioteka jest nadal kompilowana w taki sposób, że dany typ jest wpisany jako uint16_t, więc nie powinieneś próbować tego zmieniać (przez usunięcie np. Typedef), aby zachować kompatybilność binarną ze skompilowaną biblioteką.

+2

Z doświadczenia (tak, ja też robię takie hacki) Polecam stworzyć własny nagłówek właśnie robiąc to, a potem zawsze zawsze włączając ten nagłówek. W ten sposób jesteś przygotowany na więcej niespodzianek. – PlasmaHH

+0

Nigdy nie myślałem, że będę zadowolony z posiadania preprocesora. – Trismegistos

+0

Tak @PlasmaHH to byłby naprawdę następny krok.Nowe nagłówki powinny mieć dokładnie taką samą nazwę, ale ich katalog powinien mieć wyższy priorytet w 'INCLUDE_PATH', tak, że nie musisz zmieniać * żadnego * pliku w bazie kodu. – leemes

2

C++ 11 definiuje char32_t i char16_t jako typy wbudowane. Ten błąd występuje tylko wtedy, gdy używasz C++ 11. czyli w Application.mk pliku masz:

APP_CPPFLAGS += -std=c++11 

Można też usunąć wsparcie C++ 11, LUB użyć następującego obejścia, które prawdopodobnie powinny być częścią oficjalnego źródła Android (jeśli jeszcze nie).

w pliku /frameworks/native/include/utils/Unicode.h

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

Jest on oparty na odpowiedziach od a question about char16/32_t with C++11

Powiązane problemy