2017-01-25 5 views
0

私のアプリケーションは、Qt5.xではなくQt4.xにデフォルト設定されているシステムで使用することができ、私はコンパイル/リンクしてメジャーバージョンのライブラリ。私はが最も良いと思っていた Qt4.xにQ_NULLPTRがないことを回避する方法はありますか?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プロジェクトファイルに私がthisで言及リンクがSOとして定義を示していた答えを見ましたか?

+0

なぜアプリケーションで 'nullptr'ではなく' Q_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は、C++ 11対応コンパイラと古いC++ 98/03コンパイラの両方をサポートするQtの方法です。実際にそのレベルの洗練が必要ですか?そうでない場合は、コンパイラによってはNULL,0またはnullptrを直接使用してください。

それ以外の場合は、現在アクティブなC++バージョンを検出する必要があるため、状況がより複雑になります。以下の編集を参照してください。

もちろん、簡単な方法を選択して、NULLまたは0をすべてのバージョンのC++で使用できます。あなたは、この使用することができQt5の行動を模倣する

編集

:ちょうどQ_NULLPTRへのアクセス権を持っているヘッダを含む

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

はそれほど大きくありませんので、あなたはおそらく定義することをお勧めしますそのマクロは.proファイルにあります。しかし、Qt4のQMakeでアクティブなC++バージョンを検出する方法はわかりません。

+0

Q_NULLPTR __は_Qt4.xに存在しません___したがって私の質問 - 私は過去に難しい「0」を使っていたと思うが、それが最善の選択だろうとは思っていなかった...! – SlySven

+0

Qt4は 'Q_NULLPTR'を提供しません。それは単なる通常のマクロです。柔軟性が必要な場合は、Qt4ビルドに対して独自のコードを作成するときに自分自身を定義しない理由はありません。 – besc

+0

ええ、__what__はその場合にそれを定義するのに最適です - それは私が尋ねていると思ったものです! 8-)私は、QtがQt4でもQ_COMPILER_NULLPTRをまだ定義していることを期待していましたが、私は見てみる必要があると思います。 – SlySven

関連する問題