Фон
Я хочу создать библиотеку, в которой есть некоторое взаимодействие с Qt, и хотел разработать набор инструментов для ускорения разработки моей библиотеки. Я полагаю, что использование определений макросов для моей структуры библиотеки - правильный путь, поскольку это позволило бы и мне, и потребителю библиотеки выразить наибольшее количество контроля над кодом. К сожалению, ClangCodeModel, кажется, падает при разборе, хотя я удалил все возможные флаги.
Проблема
Я определил серию макросов следующим образом:
#ifndef NAMESPACE_NAME
#define NAMESPACE_NAME test
#endif
#ifndef BEGIN_NAMESPACE
#define BEGIN_NAMESPACE namespace NAMESPACE_NAME {
#endif
#ifndef END_NAMESPACE
#define END_NAMESPACE }
#endif
#ifndef NAMESPACE_ALIAS
#define NAMESPACE_ALIAS te
#endif
#ifndef USE_NAMESPACE_ALIAS
BEGIN_NAMESPACE END_NAMESPACE /* Namespace must be declared first */
namespace NAMESPACE_ALIAS = NAMESPACE_NAME;
#endif
Я считаю этот подход предпочтительным по ряду причин, в основном из-за уровня контроля, который он позволяет мне выразить, а также из-за способности вводить уникальные идентификаторы. Этот подход позволяет мне выполнять полезные функции обслуживания, такие как вложение пространств имен, без необходимости выполнять массовый поиск и замену (пример: перемещение test
пространства имен в test::math
или что-то подобное может быть проблемой даже в современных IDE), которые я Я довольно часто занимаюсь этим, хотя, как известно, раньше занимался разработкой библиотек Однако использование этого общего определения даже с точки зрения только проекта вызвало сбой ClangCodeModel при каждом нажатии клавиши.
Пример
Набрав следующее:
BEGIN_NAMESPACE
struct test{};
END_NAMESPACE
Будет вызывать каждый раз сбой ClangCodeModel со следующим сообщением: Clang Code Model Error: The clangbackend process has finished unexpectedly and was restarted.
Я добавил рекомендуемые переменные окружения из по этой ссылке , а libclang jsut сообщает crash detected during reparsing
с трассировкой стека из libc.so.6 clone + 109
(hex : 0x6d
).
Вопрос (тел; др)
Почему при добавлении макроса BEGIN_NAMESPACE
и END_NAMESPACE
Clang Code Model вызывает segfault? Когда код перезаписывается так, чтобы namespace NAMESPACE_NAME {}
Clang Code Model больше не работал с ошибками. Что я могу сделать, чтобы это исправить? Реорганизовать мой дизайн было бы очень неудобно, но я не вижу причин, почему модель кода Clang не может анализировать определения пространства имен, скрытые за макросами.