2017-01-25 376 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