web-dev-qa-db-ja.com

C ++でNULLを使用していますか?

可能性のある複製:
C++のポインターにNULLまたは0(ゼロ)を使用しますか?

C++でNULLを使用するか、値0のみを使用するのは良い考えですか?

C++から呼び出すCコードでNULLを使用する特別な状況はありますか? SDLが好きですか?

33
Jookia

C++では、NULLは0または0Lに展開されます。 Stroustrup からのこのコメントを参照してください。

NULLまたは0を使用する必要がありますか? C++では、NULLの定義は0であるため、美的な違いのみがあります。私はマクロを避けることを好むので、0を使用します。NULLの別の問題は、人々がそれが0や整数ではない、またはその両方と異なると時々誤解することです。先行標準のコードでは、NULLが不適切なものに定義されていたため、避ける必要がありました。最近ではそれほど一般的ではありません。

Nullポインターに名前を付ける必要がある場合は、nullptrと呼びます。それがC++ 0xで呼び出されることです。次に、「nullptr」がキーワードになります。

34
Tarantula

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

13
user180326

crtdbg.h(および他の多くのヘッダー)から:

#ifndef NULL
#ifdef __cplusplus
#define NULL    0
#else
#define NULL    ((void *)0)
#endif
#endif

したがって、NULL0、少なくともWindowsプラットフォームでは。いいえ、私が知っていることではありません。

3
Konrad

CまたはC++コードでNULLを使用することはありません。 _0_はif (ptrname)と同様に正常に機能します。有能なCまたはC++プログラマは、それらの機能を知っている必要があります。

1
T.E.D.

たとえば(void*)0または(char*)0のようにNULLを定義するライブラリまたはシステムヘッダーがないと仮定すると問題ありません。定義上、ヌルポインターであるため、私は常に0を使用する傾向があります。 c ++ 0xでは、nullptrが利用できるので、質問はそれ以上問題になりません。

1
Mark B