根据C++ primer,<cstdlib>
标题定义NULL
。 cpluspplus表示它已在<cstddef>
中定义。
最终,如果未包含正确的标头,我认为无法引用NULL
。
从我所看到的情况来看,只有<iostream>
请帮助我理解这一点。
答案 0 :(得分:39)
C标准要求在locale.h
,stddef.h
,stdio.h
,stdlib.h
,string.h
,time.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 一节中提到了这一点。
这是表格和周围文字的图像。
答案 4 :(得分:-3)
在最新版本的MinGW(MinGW 5.3.0)中,在wchar.h标头中定义了NULL:
#define NULL 0