将 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 编译器的方式。你真的需要那种复杂程度吗?如果没有,则直接使用NULL
、0
或nullptr
,具体取决于您的编译器。
否则事情会变得更加复杂,因为您需要检测当前活动的 C++ 版本。请参阅下面的编辑。
当然,您总是可以选择简单的方法并使用适用于所有 C++ 版本的 NULL
或 0
。
编辑
要模仿 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?的主要内容,如果未能解决你的问题,请参考以下文章