将 Qt5 应用程序反向移植到 Qt4 时替换 Q_NULLPTR?

Posted

技术标签:

【中文标题】将 Qt5 应用程序反向移植到 Qt4 时替换 Q_NULLPTR?【英文标题】:Replacement for Q_NULLPTR when backporting a Qt5 application to Qt4? 【发布时间】:2017-01-25 20:18:07 【问题描述】:

我的应用程序可能在仍然默认为 Qt4.x 而不是 Qt5.x 的系统上使用,并且我试图做一个版本的“快速而肮脏”的端口,可以编译/链接并与任一主要版本一起运行的图书馆。我想知道解决 Qt4.x 中没有 Q_NULLPTR 的最佳方法是什么?我看到this SO 回答中提到的链接,它表示定义为:

#ifdef Q_COMPILER_NULLPTR
# define Q_NULLPTR         nullptr
#else
# define Q_NULLPTR         NULL
#endif

所以我应该只使用:

contains(QT_MAJOR_VERSION, 4) 
DEFINES += Q_NULLPTR=NULL

在我的qmake 项目文件中?

【问题讨论】:

为什么在你的应用程序中使用Q_NULLPTR而不是nullptr?如果您使用 C++11 编译器,那么您使用的 Qt 版本无关紧要。 我或许应该改写为“我正在贡献的 FOSS 应用程序”——几年前我们切换到 Qt 5.x 后,我们就开始使用 Q_NULLPTR——我试图找到一种方法回到与 Qt4.x 兼容的状态并尽可能少地进行更改;而且我不相信使用 Qt4.x 的人会使用 C++11 编译器(例如,他们可能使用 gcc 4.7 而不是 4.9)... 【参考方案1】:

Q_NULLPTR 是 Qt 支持 C++11 编译器和旧 C++98/03 编译器的方式。你真的需要那种复杂程度吗?如果没有,则直接使用NULL0nullptr,具体取决于您的编译器。

否则事情会变得更加复杂,因为您需要检测当前活动的 C++ 版本。请参阅下面的编辑。

当然,您总是可以选择简单的方法并使用适用于所有 C++ 版本的 NULL0

编辑

要模仿 Qt5 的行为,您可以使用以下代码:

#if __cplusplus >= 201103L
    #define Q_NULLPTR nullptr
#else
    // not NULL to stay consistent with Qt’s convention
    #define Q_NULLPTR 0
#endif

仅仅为了访问Q_NULLPTR 而包含一个标题并不是特别好,因此您可能希望在 .pro 文件中定义该宏。但是,我不知道如何使用 Qt4 的 QMake 检测活动的 C++ 版本。

【讨论】:

但是 Q_NULLPTR Qt4.x 中不存在因此我的问题 - 我认为我们过去使用过硬 0 但我不确定这是否是最佳选择...! Qt4 不提供Q_NULLPTR 没关系。这只是一个普通的宏。如果您需要它提供的灵活性,那么当您针对 Qt4 构建自己的代码时,没有理由不自己定义它。 是的,但是 what 是在这种情况下定义它的最佳选择 - 这就是我想我要问的! 8-) 我希望即使在 Qt 4 中 Qt 仍然可以定义 Q_COMPILER_NULLPTR - 但我想我必须看看... 这就是我试图回答的问题。 :) 也许这还不够清楚。修改了我的答案。

以上是关于将 Qt5 应用程序反向移植到 Qt4 时替换 Q_NULLPTR?的主要内容,如果未能解决你的问题,请参考以下文章

从 Qt4 移植到 Qt5,Qt::WA_PaintOutsidePaintEvent 不再存在

Qt5 (Linux/LXDE) 中不显示系统托盘图标

项目qt4迁移代码到qt5

Qt4升级到Qt5需要干的那些事(CMake)

LinuxQT5移植到Linux ARM

LinuxQT5移植到Linux ARM