#c #qt #c 11 #macros #qt-creator
#c #qt #c 11 #макросы #qt-creator
Вопрос:
Предыстория
Я хочу создать библиотеку, которая имеет некоторое взаимодействие с 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
).
Вопрос (tl; dr)
Почему добавление макроса BEGIN_NAMESPACE
и END_NAMESPACE
приводит к сбою модели Clang Code в segfault? Когда код переписывается, чтобы namespace NAMESPACE_NAME {}
модель Clang Code больше не допускала сбоев. Могу ли я что-нибудь сделать, чтобы это исправить? Было бы не очень неудобно провести рефакторинг моего дизайна, но я не вижу причин, по которым модель Clang Code не должна иметь возможности анализировать определения пространства имен, скрытые за макросами.
Комментарии:
1. У меня были похожие проблемы в прошлом, но после обновления до QtCreator 4.8.2 больше не было. Я предлагаю вам попробовать более свежую версию. 🙂. Но действительно контролируйте использование макросов (как в; не используйте макросы).
2. Я имею в виду, мне не нужна эта функциональность, но я думаю, что если, возможно, я или вышестоящий сотрудник почувствуем, что одна библиотека или ее подмодуль действительно принадлежит где-то еще, миграция должна занимать порядка минут, а не часов (опять же, более полезно на ранних этапах).