Как бороться с: 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