C++ primer によると、<cstdlib>
ヘッダーはNULL
を定義します。 cpluspplus は、<cstddef>
で定義されていることを示します。
最終的に、右側のヘッダーが含まれていない場合、NULL
を参照できないと思いました。
私が見ることができるものから、しかし、それは参照され、プログラムを生成し、<iostream>
のみを含めた後、警告またはエラーなしでコンパイルおよび実行できます。
これを理解してください。
C++ 03セクション18.1.2には、NULLがcstddefで定義されていると記載されています。
実装によっては、iostreamにcstddefが含まれる場合があるため、iostreamを含めるとNULLが返されます。
C標準では、locale.h
、stddef.h
、stdio.h
、stdlib.h
、string.h
、time.h
、およびwchar.h
でNULLを定義する必要があります。
C++標準では、それぞれに対応するc*
ヘッダーにNULLを定義する必要があります。
C標準は、標準が定義できる名前について非常に厳密です。各標準ヘッダーは、標準がそのヘッダーの定義に必要な名前を正確に定義する必要があります。定義できる他の名前は、アンダースコアで始まり、別のアンダースコアまたは大文字が続くものなど、実装用に予約されているものだけです。
C++標準はこの点ではるかに寛容です。1つの標準ヘッダーを含めると、他の標準ヘッダーの一部またはすべてを含めるのと同じ効果があります。
実用的な観点から、C++の実装はこの寛容性をかなり活用していました。つまり、1つの標準ヘッダーが他の多くの標準ヘッダーの名前を頻繁に定義していました。より最近の実装は、C標準が要求するように動作する傾向があり、各ヘッダーにずっと近いままで、そのヘッダーで定義するために必要な名前のみを定義します。おそらく、C標準が要求するほど厳密ではありませんが、(規則として)以前よりもはるかに厳密です。
<cstddef>
で定義されています
C++ 11標準セクション18.2、表30は、<cstddef>
の内容を説明しています。
表30 —ヘッダー
<cstddef>
概要マクロ:
NULL
[...][...]マクロNULLは、この国際標準の実装定義のC++ nullポインター定数です。