如何欺骗QtCreator关于宏定义的存在

时间:2013-03-28 19:15:37

标签: c++ qt-creator qmake build-system

当在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。

1 个答案:

答案 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的实例以及完成成员。