根据 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
我需要在我的代码中包含以下 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