2017-01-25 37 views
0

我的应用程序可能用于仍然默认Qt4.x而不是Qt5.x的系统,我试图做一个“quick and dirty”端口来编译/链接和运行主版本图书馆。我想知道什么是最佳方式来解决Qt4.x中Q_NULLPTR的缺失?我看到this提到的链接,以便回答这表明定义为:将Qt5应用程序移植到Qt4时替换为Q_NULLPTR?

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

所以我应该只使用一个:

contains(QT_MAJOR_VERSION, 4) { 
DEFINES += Q_NULLPTR=NULL 
} 
在我 qmake项目文件

+0

为什么在应用程序中使用'Q_NULLPTR'而不是'nullptr'?如果您使用C++ 11编译器,则使用何种版本的Qt无关紧要。 – sharyex

+0

我也许应该改为说“我为之贡献的FOSS应用程序” - 几年前,当我们转换到Qt 5.xa时,我们开始使用Q_NULLPTR--我试图找到回到Qt4的方式.x兼容并尽可能少地做出改变;我不相信使用Qt4.x的人会使用C++ 11编译器(例如,他们可能在'gcc' 4.7而不是4.9)... – SlySven

回答

0

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

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

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

编辑

要模仿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++版本。

+0

但是Q_NULLPTR __is不存在于_Qt4.x中___因此我的问题 - 我认为我们过去使用了一个很难的'0',但我不确定这是否是最好的选择......! – SlySven

+0

Qt4不提供'Q_NULLPTR'无关紧要。这只是一个常规的宏。如果您需要它提供的灵活性,当您针对Qt4构建自己的代码时,没有理由不自己定义它。 – besc

+0

是的,但__what__是最好的事情来定义它 - 这是我以为我问的问题! 8-)我希望Qt可能仍然会在Qt 4中定义'Q_COMPILER_NULLPTR' - 但我想我必须看一看,然后看... – SlySven

相关问题