包含指令取决于Qt版本

时间:2015-10-28 10:06:17

标签: c++ qt include c-preprocessor

我需要在我的代码中包含以下标题:

#include <5.4.1/QtGui/private/qzipwriter_p.h>

问题是,我们正在其他Qt版本上编译它,例如5.4.2或5.5.x

我知道我不应该使用这些“私有”标题,因为它们不受支持,但我们至少需要它们,直到我们有一个持久的替代品。

如何在路径中连接QT_VERSION_STR变量,以便适用于所有版本?

4 个答案:

答案 0 :(得分:4)

改为使用QT_VERSION

  

QT_VERSION   此宏扩展了指定Qt版本号的形式0xMMNNPP(MM = major,NN = minor,PP = patch)的数值。

#if QT_VERSION == 0x050401
  #include <5.4.1/QtGui/private/qzipwriter_p.h>
#endif

修改

  

不知道在路径中连接版本字符串吗?

标准不允许(16.3.4 / 3):

  

生成的完全宏替换的预处理标记序列不会作为预处理进行处理   指令,即使它类似于一个

因此,您无法创建一个将扩展为#include指令的宏。您也无法在include#include <like this>)的括号内使用宏,因为括号内的所有内容都只是一个字符串。

答案 1 :(得分:2)

您可以使用人类可读帮助QT_VERSION_CHECK来比较数字QT_VERSION宏,该帮助C Macro - Dynamic #include将主要,次要和补丁编号组合为QT_VERSION格式:

#if QT_VERSION == QT_VERSION_CHECK(5, 4, 1)
//...
#endif

从GCC标题QT_*_VERSION

中获取连接的想法

问题是我们没有Qt major,minor和patch版本的宏令牌。只有数字QT_VERSION。因此,获得所需数字很棘手。可以使用.pro变量{{3}}从qmake文件中将它们作为宏定义传输:

DEFINES += QT_MAJOR_VERSION=$$QT_MAJOR_VERSION
DEFINES += QT_MINOR_VERSION=$$QT_MINOR_VERSION
DEFINES += QT_PATCH_VERSION=$$QT_PATCH_VERSION

现在这些宏版本可以在源文件中使用:

// To return as a string: "5.4.1/QtGui/private/qzipwriter_p.h"
#define qt_header__(x) #x
#define qt_header_(major,minor,patch) qt_header__(major.minor.patch/QtGui/private/qzipwriter_p.h)
#define qt_header(major,minor,patch) qt_header_(major,minor,patch)

// Simpler without stringification, however Qt Creator cannot follow
// that header
#define qt_header(major,minor,patch) <major.minor.patch/QtGui/private/qzipwriter_p.h>

#include qt_header(QT_MAJOR_VERSION, QT_MINOR_VERSION, QT_PATCH_VERSION)

最好使用字符串变体("5.4.1/QtGui/private/qzipwriter_p.h")。在这种情况下,Qt Creator的最新版本可以遵循这样的qt_header()宏并相应地突出显示文本。

答案 2 :(得分:0)

使用cmake就可以这样:

的CMakeLists.txt:

find_package(Qt5 COMPONENTS Core Qml)
add_definitions(-DQT_VERSION_MAJOR=${Qt5_VERSION_MAJOR})
add_definitions(-DQT_VERSION_MINOR=${Qt5_VERSION_MINOR})
add_definitions(-DQT_VERSION_PATCH=${Qt5_VERSION_PATCH})

yourcode.cpp:

#define p_qqmljslexer(major,minor,patch)  <major.minor.patch/QtQml/private/qqmljslexer_p.h>

#include p_qqmljslexer(QT_VERSION_MAJOR, QT_VERSION_MINOR, QT_VERSION_PATCH)  

答案 3 :(得分:0)

带有两个字母的minor_version,例如5.11无效,但是有效

#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
    auto isok = f.open(QIODevice::NewOnly| QIODevice::Text);
#else
    auto isok = !QFileInfo::exists(newfile) && f.open(QIODevice::Text);
#endif