Как бороться с: redeclaration встроенного типа C++ ‘char16 t’

в проекте C++11 я должен использовать внешнюю библиотеку C++. Этот файл главного заголовка библиотеки определяет

typedef uint16_t        char16_t;  

и из-за этого компиляция программы C++, которая включает в себя эту библиотеку, терпит неудачу, с сообщением:

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

единственная идея, которую я имею, это переупаковывать всю библиотеку, но потому что char16_t распространен в этой библиотеке, это будет очень трудоемко (если это вообще возможно). Есть ли какие-то разумные способы справиться с этим проблема?

Edit:

у меня также есть еще одна идея удаления проблемной строки и замены каждого вхождения char16_t на uint16_t, но мне пришлось бы изменить заголовки сторонних библиотек, и мне не особенно нравится эта идея (могут быть более похожие ошибки). Поэтому я также задаюсь вопросом, есть ли хороший способ решения более широкой проблемы несовместимости между C++ и C при включении заголовков.

2 ответов


вы можете использовать макрос для переименования типа библиотеки, сохраняя его не связанным с новым типом языка char16_t:

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

затем заголовок библиотеки будет скомпилирован в вашей базе кода таким образом, что typedef имеет имя LIBRARY_char16_t.

сама библиотека по-прежнему скомпилирована таким образом, что рассматриваемый тип typedef'ed в uint16_t таким образом, вы не должны пытаться изменить это (например, удалив typedef), чтобы оставаться двоичным-совместимым с скомпилированным библиотека.


C++11 определяет char32_t и char16_t как встроенные типы. Эта ошибка возникает только при использовании C++11. т. е. в вашем приложение.МК файл:

APP_CPPFLAGS += -std=c++11

вы можете либо удалить поддержку C++11,или используйте следующий обходной путь, который, вероятно, должен быть частью официального источника Android (если еще нет).

в файле / Framework / native / include/utils / Unicode.h

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

Он основан на ответы вопрос о char16 / 32_t с C++11