什么标头在C ++中定义NULL?

时间:2012-08-19 01:16:49

标签: c++ null

根据C++ primer<cstdlib>标题定义NULLcpluspplus表示它已在<cstddef>中定义。

最终,如果未包含正确的标头,我认为无法引用NULL

从我所看到的情况来看,只有<iostream>

之后,它才能被引用并生成程序,并且在没有警告或错误的情况下编译和运行

请帮助我理解这一点。

5 个答案:

答案 0 :(得分:39)

C标准要求在locale.hstddef.hstdio.hstdlib.hstring.htime.h和{中定义NULL {1}}。

C ++标准要求在与wchar.h标题相对应的c*标题中定义NULL。

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

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

从实际的角度来看,C ++实现过去常常采用这种宽容性的优势 - 也就是说,包括一个标准头文件经常定义来自许多其他标准头文件的名称。最近的实现倾向于更像C标准所要求的工作,更接近每个标头,仅定义由该标头定义所需的名称。它们可能仍然不像C标准那样严格,但比以前更接近(通常)。

答案 1 :(得分:25)

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

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

答案 2 :(得分:3)

它在<cstddef>

中定义

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

  

表30 - 标题<cstddef>概要

     

宏:NULL [...]

     

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

答案 3 :(得分:3)

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

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

表149,标准 C.3 C标准库/ 3 一节中提到了这一点。

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

enter image description here

答案 4 :(得分:-3)

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

#define NULL 0