当在C ++ / Qt项目中使用一些奇特的C ++ 11特性时,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
所以当QtCreator分析文件时,我想到只是宏查看我的Ptr
定义,但当编译器解析文件时,当然会使用漂亮的模板化别名语法 / em>的。类似的东西:
#ifdef QT_CREATOR
# define Ptr QSharedPointer
#else
template<class T> using Ptr = QSharedPointer<T>;
#endif
使用DEFINES += -D...
在.pro文件中放置宏定义是行不通的,因为QtCreator非常聪明,可以在代码模型中使用它们(当然这很好)。此外,QMAKE_CXXFLAGS += -D...
正在被正确解析(遗憾地)。
我如何“欺骗”QtCreator有一个定义的宏,但是(对于编译器)没有(或者反过来)?
PS:我使用的是最新版本(2.7),还尝试过2.6。
答案 0 :(得分: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
的实例以及完成成员。