52

C ++入門書によると、<cstdlib>ヘッダーはを定義しますNULLcpluspplusは、で定義されていると言います<cstddef>

NULL最終的に、正しいヘッダーが含まれていないと、参照できないと思いました。

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

これを理解するのを手伝ってください。

4

5 に答える 5

48

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

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

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

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

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

于 2012-08-19T04:49:35.473 に答える
33

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

一部の実装では、iostreamにcstddefが含まれている場合があるため、iostreamを含めるとNULLが返されます。

于 2012-08-19T01:26:48.230 に答える
3

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

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

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

マクロ:NULL[...]

[...]マクロNULLは、この国際規格で実装定義されたC++nullポインタ定数です。

于 2012-08-19T01:21:51.593 に答える
3

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

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

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

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

ここに画像の説明を入力してください

于 2015-12-23T08:11:42.673 に答える
-4

MinGWの最新バージョン(MinGW 5.3.0)では、NULLはwchar.hヘッダーで次のように定義されていました。

#define NULL 0
于 2016-05-12T09:02:04.263 に答える