C++ 包含指令,具体取决于Qt版本

C++ 包含指令,具体取决于Qt版本,c++,qt,include,c-preprocessor,C++,Qt,Include,C Preprocessor,我需要在代码中包含以下标题: #include <5.4.1/QtGui/private/qzipwriter_p.h> #包括 问题是,我们正在其他Qt版本上编译,如5.4.2或5.5.x 我知道我不应该使用这些“私有”头,因为它们不受支持,但我们至少需要它们,直到我们有一个持久的替代品 如何将路径中的QT\u VERSION\u STR变量串联起来,使其适用于所有版本?改用QT\u VERSION: QT_版本 此宏展开一个数值,其格式为0xMMNNPP(MM=major,N

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

#include <5.4.1/QtGui/private/qzipwriter_p.h>
#包括
问题是,我们正在其他Qt版本上编译,如5.4.2或5.5.x

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


如何将路径中的
QT\u VERSION\u STR
变量串联起来,使其适用于所有版本?

改用
QT\u VERSION

QT_版本 此宏展开一个数值,其格式为0xMMNNPP(MM=major,NN=minor,PP=patch),用于指定Qt的版本号

#如果QT_版本==0x050401
#包括
#恩迪夫
编辑:


不知道如何在路径中连接版本字符串

本标准不允许(16.3.4/3):

生成的完全由宏替换的预处理令牌序列不作为预处理进行处理 指令,即使它与指令相似


因此,您无法生成将扩展为
#include
指令的宏。您也不能在
include
#include
)的括号内使用宏,因为括号内的所有内容都只是一个字符串。

您可以使用可读的辅助程序比较数值
QT\u版本
宏,该辅助程序将主、次和补丁号组合成
QT\u版本
格式:

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

连接的想法取自GCC头

问题是我们没有Qt主版本、次版本和补丁版本的宏标记。只有数值
QT\u版本
。因此,获取所需的数字很难。可以使用
qmake
变量将它们作为宏定义从
.pro
文件传输:

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

// 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_头_uuuuux)#x
#定义qt_头(主、次、补丁)qt_头(主、次、补丁/QtGui/private/qzipwriter\u p.h)
#定义qt_头(主、次、补丁)qt_头(主、次、补丁)
//没有字符串化就更简单,但是Qt创建者无法遵循
//那个头球
#定义qt_标题(主要、次要、补丁)
#包括qt_头(qt_主版本、qt_次版本、qt_补丁版本)

最好使用字符串化变体(
“5.4.1/QtGui/private/qzipwriter\u 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)  
#定义p_qqmljslexer(主要、次要、补丁)
#包括p_qqmljslexer(QT_版本_大调、QT_版本_小调、QT_版本_补丁)

带有两个字母的次要版本,例如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

不知道如何在路径中连接版本字符串?@galinette不,可以连接宏标记,但不连接字符串,以使用您需要的不是字符串而是类似于
#define VER 5.4.1
的内容。然后可以从这样的
VER
宏生成包含路径。@galinette I用可能的连接更新了答案。Qt中有一个版本字符串,它是
Qt\u version\u STR
,如问题所示。至少在qt4和Qt中,它完全等于“major.minor.patch”5@galinette
QT\u VERSION\u STR
是一个字符串。它被定义为
#define QT#u VERSION_STR“5.4.1”
,但您需要它而不带引号。不知道如何在路径中连接版本字符串?@galinette,您可能需要一些恶作剧,但通常不会。您尝试过
#include
?这难道不包括当前Qt安装所需的一次吗?如果只需要这一个文件,只需包含常量路径(例如在环境变量中设置)
#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)  
#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