Сбой модели QtCreator 4.4.1 Clang Code при попытке разрешить имя пространства имен, скрытое за макросами

#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. Я имею в виду, мне не нужна эта функциональность, но я думаю, что если, возможно, я или вышестоящий сотрудник почувствуем, что одна библиотека или ее подмодуль действительно принадлежит где-то еще, миграция должна занимать порядка минут, а не часов (опять же, более полезно на ранних этапах).