11

重複の可能性:
nullptr を C++-pre-C++0x プログラムに「バックポート」する

nullptrC++03 と C++11 の両方をサポートするための定義方法は?

以下のコードは、C++11 コンパイラの nullptr の意味を変更せずに、C++03 と C++11 の両方のコンパイルでコンパイルされますか?

#include <cstddef>

#if !defined(nullptr)
#define nullptr NULL
#endif
4

2 に答える 2

13

C++11 ではnullptr、タイプはnullptr_tです。NULL(または0マクロが好きではないので Bjarne と言うでしょう) と比較した場合の大きな利点の 1 つは、これら 2 つの関数の間にあることです。

void foo(char*);
void foo(int);

foo(nullptr)オーバーロードを呼び出しますが、char*オーバーロードfoo(NULL)を呼び出しますint。したがって、ソリューションはほとんどの場合に機能する可能性がありますが、関数のオーバーロードでエラーが発生する場合があります。

于 2012-05-08T10:32:58.710 に答える
9

AFAIKでは、コード内からサポートの検出を自動化することはできませんnullptr

実際には、それを「不可能」と読むことができます。これはかなり強力な「AFAIK」です。

したがって、行うべきことは、コンパイラ固有のコードやビルドコマンドを使用することです。たとえば、関連する各ソースに

#include <cpp/nullptr.h>

また、buildコマンドでインクルードパスを調整して、nullptrサポート付きのコンパイラの場合は空のヘッダーを取得し、がない古いコンパイラの場合はnullptr、それを定義するヘッダーを取得します(たとえば)。

そして、非常に徹底的にテストしてください!

私は、ヘッダーの複数のバージョンを持ち、ビルドコマンドで選択されたのは仮想ヘッダーの1つだけであるという一般的な概念と呼んでいます。より一般的な場合にのみ意味のある規則を含め、その周りに多くの機械を構築することが可能です。幸い、この特定のケースでは必要ありませんが、おそらく知っておく価値があります。

要約すると、C ++ソースコードに魔法のように物事を行わせることは、ここに行く方法ではありません。ビルドレベルで少しヘルプを追加するのはほぼ正しいようです。:-)

于 2012-05-08T10:45:47.610 に答える