据C ++引物 , <cstdlib>
标头定义NULL
。 cpluspplus说,这是在所定义<cstddef>
最终,如果不包含正确的头,我以为NULL
不能被引用。
从我所看到的,但它可以被引用和产生程序和编译没有警告或错误运行,只包括后<iostream>
请帮我理解这一点。
据C ++引物 , <cstdlib>
标头定义NULL
。 cpluspplus说,这是在所定义<cstddef>
最终,如果不包含正确的头,我以为NULL
不能被引用。
从我所看到的,但它可以被引用和产生程序和编译没有警告或错误运行,只包括后<iostream>
请帮我理解这一点。
C ++ 03部分18.1.2说,NULL在cstddef定义。
在一些实现,可以iostream的包括cstddef,所以包括的iostream也会给你NULL。
C标准要求NULL中定义locale.h
, stddef.h
, stdio.h
, stdlib.h
, string.h
, time.h
,和wchar.h
。
C ++标准要求NULL在被定义c*
对应于每个这些的报头。
C标准是非常严格的标准可以定义的名称 - 每个标准的头必须精确定义的标准要求标头中定义的名称。 它可以定义的唯一其他的名字是那些保留给实现,如那些开始以下划线后跟其他下划线或大写字母。
C ++标准是更宽容在这方面 - 包括任一个标准报头可以具有为包括任何或所有其它标准头相同的效果。
从实用的观点来看,使用C ++实现采取了相当多的优点本放纵 - 即,包括一个标准头经常来自多个其他标准头中定义的名称。 最近实现往往更喜欢C标准工作需要,保持更接近每头只通过定义由该标题中定义所需要的名字。 他们仍然可能没有那么严格它作为C标准要求,而且比他们曾经是(通常)非常接近。
据中所定义<cstddef>
在C ++ 11标准节18.2,表30解释了什么是在<cstddef>
它说:
表30 -头
<cstddef>
概要宏:
NULL
[...][...]宏NULL是一个实现德音响奈德C ++空指针在本国际标准恒定
在C ++ 11标准说, NULL
,必须在多个文件中定义。 他们是:
<clocale>
<cstddef>
<cstdlib>
<cstring>
<ctime>
<cwchar>
这在表149的标准的,节C.3 C标准库/ 3中提及。
这里的表和周围的一些文本的图像。
在MinGW的(MinGW的5.3.0)的最新版本NULL在wchar.h标头,如定义:
#define NULL 0