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

标签 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 定义进行宏修改,但是当然在编译器解析时使用漂亮的模板化别名语法 文件。像这样的东西:

#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。

最佳答案

下面的代码用来欺骗 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 的实例以及完整的成员。

关于c++ - 如何欺骗 QtCreator 关于宏定义的存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15690294/

相关文章:

c++ - 试图将两个类放在同一个命名空间的不同文件中,但只有第一个 #included 类有效

c++ - 从模板值获取类型,C++

Qt4 如何在小部件内部绘图?

Qt5.7 qmake; "The system cannot find the path specified."是什么意思以及如何修复它?

c++ - qt windows 包含 boost 线程 header 失败

c++ - 如何让 CMake 用两种不同的语言编译相同的输入文件?

qt - QXcbConnection:XCB错误:2个Qt安装程序Docker

c++ - Qt Creator 找不到库

build-process - Qmake Scons生成器

c++ - 如何在最后一个 EOL 后删除文件内容?