52

根据C++ 入门<cstdlib>标头定义NULL. cpluspplus说它是在<cstddef>.

最终,如果没有包含正确的标题,我认为NULL无法引用。

从我所看到的,但是它可以被引用并生成程序并且编译和运行没有警告或错误,只包括<iostream>

请帮助我理解这一点。

4

5 回答 5

48

locale.hC 标准要求在、stddef.hstdio.hstdlib.hstring.htime.h和中定义 NULL wchar.h

C++ 标准要求 NULL 定义在c*对应于每一个的标头中。

C 标准对标准可以定义的名称非常严格——每个标准头文件必须精确定义标准要求该头文件定义的名称。它可以定义的唯一其他名称是为实现保留的名称,例如以下划线开头,后跟另一个下划线或大写字母的名称。

C++ 标准在这方面更为宽松——包括任何一个标准头文件都可以与包括任何或所有其他标准头文件具有相同的效果。

从实际的角度来看,C++ 实现曾经相当多地利用了这种许可性——也就是说,包括一个标准头文件,经常从许多其他标准头文件中定义名称。最近的实现往往更像 C 标准所要求的那样工作,与每个标头更接近,只定义由该标头定义的名称。他们可能仍然没有 C 标准要求的那么严格,但比以前更接近(通常)。

于 2012-08-19T04:49:35.473 回答
33

C++03 第 18.1.2 节说 NULL 在 cstddef 中定义。

在某些实现中,iostream 可能包含 cstddef,因此包含 iostream 也会给您 NULL。

于 2012-08-19T01:26:48.230 回答
3

它定义在<cstddef>

C++11 标准第 18.2 节,表 30 解释了<cstddef>其中的内容:

表 30——标题<cstddef>概要

宏:NULL[...]

[...] 宏 NULL 是本国际标准中实现定义的 C++ 空指针常量

于 2012-08-19T01:21:51.593 回答
3

C++11 标准说NULL必须在多个文件中定义。他们是:

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

这在标准的C.3 C 标准库/3节的表 149 中有所提及。

这是表格的图像和一些周围的文字。

在此处输入图像描述

于 2015-12-23T08:11:42.673 回答
-4

在最新版本的 MinGW (MinGW 5.3.0) 中,wchar.h 标头中将 NULL 定义为:

#define NULL 0
于 2016-05-12T09:02:04.263 回答