可能性のある複製:
C++のポインターにNULLまたは0(ゼロ)を使用しますか?
C++でNULLを使用するか、値0のみを使用するのは良い考えですか?
C++から呼び出すCコードでNULLを使用する特別な状況はありますか? SDLが好きですか?
C++では、NULLは0または0Lに展開されます。 Stroustrup からのこのコメントを参照してください。
NULLまたは0を使用する必要がありますか? C++では、NULLの定義は0であるため、美的な違いのみがあります。私はマクロを避けることを好むので、0を使用します。NULLの別の問題は、人々がそれが0や整数ではない、またはその両方と異なると時々誤解することです。先行標準のコードでは、NULLが不適切なものに定義されていたため、避ける必要がありました。最近ではそれほど一般的ではありません。
Nullポインターに名前を付ける必要がある場合は、nullptrと呼びます。それがC++ 0xで呼び出されることです。次に、「nullptr」がキーワードになります。
C++のNULLの欠点は、0を定義することです。これは、ポインター、ブール値、float/double、またはintに暗黙的に変換できる値です。
それは非常にタイプセーフではなく、私が取り組んだアプリケーションの実際のバグにつながりました。
このことを考慮:
void Foo(int i);
void Foo(Bar* b);
void Foo(bool b);
main()
{
Foo(0);
Foo(NULL); // same as Foo(0)
}
C++ 11では、nullポインターに変換できるが他のスカラーには変換できないnullptr
を定義しています。これは、2008年現在のVC++を含むすべての最新C++コンパイラでサポートされています。GCCの古いバージョンにも同様の機能がありますが、その後は__null
。
crtdbg.h(および他の多くのヘッダー)から:
#ifndef NULL
#ifdef __cplusplus
#define NULL 0
#else
#define NULL ((void *)0)
#endif
#endif
したがって、NULL
は0
、少なくともWindowsプラットフォームでは。いいえ、私が知っていることではありません。
CまたはC++コードでNULLを使用することはありません。 _0
_はif (ptrname)
と同様に正常に機能します。有能なCまたはC++プログラマは、それらの機能を知っている必要があります。
たとえば(void*)0
または(char*)0
のようにNULL
を定義するライブラリまたはシステムヘッダーがないと仮定すると問題ありません。定義上、ヌルポインターであるため、私は常に0を使用する傾向があります。 c ++ 0xでは、nullptr
が利用できるので、質問はそれ以上問題になりません。