2013-03-28 2 views
1

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

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

Попробуйте использовать экспериментальный плагин ClangCodeModel. Поскольку он использует libclang для завершения/выделения, он может анализировать everithing, который поддерживает clang. https://qt.gitorious.org/+qtcreator-clang-edgers/qtcreator-clang-stable https://aur.archlinux.org/packages/qtcreator-clang-git/ –

ответ

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 сейчас, а также полные участники.

+0

сомнительное достижение – AnatolyS

+0

@AnatolyS Что вы имеете в виду ? Вы сомневаетесь, что это сделал трюк? – leemes

+0

Я имел в виду, что я бы использовал QSharedPointer без этого трюка. Что касается меня, это пара костылей для QtCreator. – AnatolyS

Смежные вопросы