nullptr
C++03 と C++11 の両方をサポートするための定義方法は?
以下のコードは、C++11 コンパイラの nullptr の意味を変更せずに、C++03 と C++11 の両方のコンパイルでコンパイルされますか?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
nullptr
C++03 と C++11 の両方をサポートするための定義方法は?
以下のコードは、C++11 コンパイラの nullptr の意味を変更せずに、C++03 と C++11 の両方のコンパイルでコンパイルされますか?
#include <cstddef>
#if !defined(nullptr)
#define nullptr NULL
#endif
C++11 ではnullptr
、タイプはnullptr_t
です。NULL
(または0
マクロが好きではないので Bjarne と言うでしょう) と比較した場合の大きな利点の 1 つは、これら 2 つの関数の間にあることです。
void foo(char*);
void foo(int);
foo(nullptr)
オーバーロードを呼び出しますが、char*
オーバーロードfoo(NULL)
を呼び出しますint
。したがって、ソリューションはほとんどの場合に機能する可能性がありますが、関数のオーバーロードでエラーが発生する場合があります。
AFAIKでは、コード内からサポートの検出を自動化することはできませんnullptr
。
実際には、それを「不可能」と読むことができます。これはかなり強力な「AFAIK」です。
したがって、行うべきことは、コンパイラ固有のコードやビルドコマンドを使用することです。たとえば、関連する各ソースに
#include <cpp/nullptr.h>
また、buildコマンドでインクルードパスを調整して、nullptr
サポート付きのコンパイラの場合は空のヘッダーを取得し、がない古いコンパイラの場合はnullptr
、それを定義するヘッダーを取得します(たとえば)。
そして、非常に徹底的にテストしてください!
私は、ヘッダーの複数のバージョンを持ち、ビルドコマンドで選択されたのは仮想ヘッダーの1つだけであるという一般的な概念と呼んでいます。より一般的な場合にのみ意味のある規則を含め、その周りに多くの機械を構築することが可能です。幸い、この特定のケースでは必要ありませんが、おそらく知っておく価値があります。
要約すると、C ++ソースコードに魔法のように物事を行わせることは、ここに行く方法ではありません。ビルドレベルで少しヘルプを追加するのはほぼ正しいようです。:-)