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