web-dev-qa-db-ja.com

C ++でNULLを定義するヘッダーは何ですか?

C++ primer によると、<cstdlib>ヘッダーはNULLを定義します。 cpluspplus は、<cstddef>で定義されていることを示します。

最終的に、右側のヘッダーが含まれていない場合、NULLを参照できないと思いました。

私が見ることができるものから、しかし、それは参照され、プログラムを生成し、<iostream>のみを含めた後、警告またはエラーなしでコンパイルおよび実行できます。

これを理解してください。

38
James Leonard

C++ 03セクション18.1.2には、NULLがcstddefで定義されていると記載されています。

実装によっては、iostreamにcstddefが含まれる場合があるため、iostreamを含めるとNULLが返されます。

25
Vaughn Cato

C標準では、locale.hstddef.hstdio.hstdlib.hstring.htime.h、およびwchar.hでNULLを定義する必要があります。

C++標準では、それぞれに対応するc*ヘッダーにNULLを定義する必要があります。

C標準は、標準が定義できる名前について非常に厳密です。各標準ヘッダーは、標準がそのヘッダーの定義に必要な名前を正確に定義する必要があります。定義できる他の名前は、アンダースコアで始まり、別のアンダースコアまたは大文字が続くものなど、実装用に予約されているものだけです。

C++標準はこの点ではるかに寛容です。1つの標準ヘッダーを含めると、他の標準ヘッダーの一部またはすべてを含めるのと同じ効果があります。

実用的な観点から、C++の実装はこの寛容性をかなり活用していました。つまり、1つの標準ヘッダーが他の多くの標準ヘッダーの名前を頻繁に定義していました。より最近の実装は、C標準が要求するように動作する傾向があり、各ヘッダーにずっと近いままで、そのヘッダーで定義するために必要な名前のみを定義します。おそらく、C標準が要求するほど厳密ではありませんが、(規則として)以前よりもはるかに厳密です。

40
Jerry Coffin

C++ 11標準では、NULLは複数のファイルで定義する必要があります。彼らです:

<clocale>
<cstddef>
<cstdlib>
<cstring>
<ctime>
<cwchar>

これについては、表149のセクションC.3 C標準ライブラリ/ 3に記載されています。

これが表の画像と周囲のテキストです。

enter image description here

3
R Sahu

<cstddef>で定義されています

C++ 11標準セクション18.2、表30は、<cstddef>の内容を説明しています。

表30 —ヘッダー<cstddef>概要

マクロ:NULL [...]

[...]マクロNULLは、この国際標準の実装定義のC++ nullポインター定数です。

3
Cornstalks