根据 Qt 版本包含指令

Include directive depending on Qt version

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

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

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

我知道我不应该使用这些 "private" header,因为它们不受支持,但至少在我们有耐用的替代品之前我们需要它们。

如何连接路径中的 QT_VERSION_STR 变量,使其适用于所有版本?

改用QT_VERSION

QT_VERSION This macro expands a numeric value of the form 0xMMNNPP (MM = major, NN = minor, PP = patch) that specifies Qt's version number.

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

编辑:

No idea for concatenating the version string in the path?

标准不允许 (16.3.4/3):

The resulting completely macro-replaced preprocessing token sequence is not processed as a preprocessing directive even if it resembles one

所以你不能制作一个宏,它会扩展成一个 #include 指令。您也不能在 include (#include <like this>) 的括号内使用宏,因为括号内的所有内容都只是一个字符串。

您可以使用人类可读的帮助程序 QT_VERSION_CHECK 比较数字 QT_VERSION 宏,它将主要、次要和补丁号组合成 QT_VERSION 格式:

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

连接的想法取自 GCC headers C Macro - Dynamic #include

问题是我们没有 Qt 主要版本、次要版本和补丁版本的宏标记。只有数字QT_VERSION。因此,很难获得所需的数字。可以使用 qmake 变量 QT_*_VERSION:

将它们作为宏定义从 .pro 文件传输
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() 宏并相应地突出显示文本。

用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)  

两个字母 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