Как обмануть QtCreator по поводу существования макроопределения

У QtCreator есть некоторые проблемы с моделью кода при использовании некоторых необычных функций C ++ 11 в проекте C ++ / Qt. В моем случае: шаблонный псевдоним, как показано ниже:

template<class T> using Ptr = QSharedPointer<T>;

QSharedPointer<SomeClass> myPtr = ...;
myPtr->...                               // will complete

Ptr<SomeClass> myPtr = ...;              // not even parsed as a type...
myPtr->...                               // won't complete

Поэтому я подумал о том, чтобы просто Ptr определение когда QtCreator анализирует файл, но, конечно, используйте хороший шаблонный синтаксис псевдонимов когда компилятор анализирует файл. Что-то вроде:

#ifdef QT_CREATOR
# define Ptr QSharedPointer
#else
template<class T> using Ptr = QSharedPointer<T>;
#endif

Помещение определения макроса в файл .pro с помощью DEFINES += -D... не будет работать, так как QtCreator достаточно умен, чтобы использовать их в модели кода (что, конечно, хорошо). Также, QMAKE_CXXFLAGS += -D... анализируется правильно (к сожалению).

Как я могу «обмануть» QtCreator, что есть определенный макрос, но (для компилятора) его нет (или наоборот)?

PS: я использую самую последнюю версию (2.7), а также попробовал 2.6.

1

Решение

Следующее работает, чтобы обмануть QtCreator по поводу определения макроса.

В файле проекта .pro я добавил следующую строку:

QMAKE_CXX = $${QMAKE_CXX} -D_IS_BEING_COMPILED

Это означает, что макрос _IS_BEING_COMPILED будет определено. Но QtCreator (по крайней мере, версия 2.7) не анализирует содержимое QMAKE_CXX для флагов (думаю, на то есть веские причины). Итак: QtCreator не видит этот макрос, но при компиляции он есть. Таким образом, ветвь препроцессора, как это, сделает работу:

#ifdef _IS_BEING_COMPILED
template<class T> using Ptr = QSharedPointer<T>;
#else
# define Ptr QSharedPointer
# error `Ptr` is a macro, but it should not!
#endif

Теперь QtCreator использует обходной путь для макросов, чтобы ввести псевдоним, который не идеален, но поскольку взломана только IDE, а не сама база кода, это нормально. QtCreator будет анализировать экземпляры Ptr сейчас, а также полные члены.

1

Другие решения

Других решений пока нет …