标头stdio.h
, stdlib.h
,string.h
声明size_t
,NULL
等。
为什么要声明size_t
,NULL
等而不是#include <stddef.h>
?
标头stdio.h
, stdlib.h
,string.h
声明size_t
,NULL
等。
为什么要声明size_t
,NULL
等而不是#include <stddef.h>
?
为什么声明 size_t、NULL 等而不是
#include <stddef.h>
?
根据 C17 7.19/3,stddef.h
确实定义NULL
了,所以这个问题是没有根据的。由于前提似乎部分是所服务的角色stddef.h
使其成为定义的好地方NULL
,标准委员会似乎同意。
stdio.h
(7.21.1/2)、stdlib.h
(7.22/3) 和string.h
(7.24.1/1) 也定义NULL
. 至于为什么会这样,我倾向于说历史变化的组合,其中头文件定义了哪些宏起作用,但这些头文件中的每一个也声明至少一个函数,其参数和/或返回值赋予空指针特定的意义。例如,fopen()
失败时返回一个空指针。尽管使用宏来表示空指针常量不是必需的NULL
,但它是非常惯用的,因此确保这些头文件定义它使其至少在大多数需要它的标准库情况下都可以访问,而无需包含仅用于此目的的标题。
同样适用size_t
,减去历史变化的角度。
经过审查,我想我最初误读了这个问题。但是,就它询问规范为什么这么说stdio.h
等而言。定义也由 定义的各种标识符stddef.h
,当它可以指定那些标头#include <stddef.h>
时,我认为它仍然主要归结为每个标头提供它需要的所有声明,以便基本上独立存在。
但是,此外,如果规范说(例如)string.h
包含stddef.h
,那么根据第 7.1.3 节,将在包含前者的任何翻译单元中保留指定由后者声明的所有标识符(在各种意义上)规格。相反,通过指定在 中声明或定义string.h
特定标识符,只有那些特定标识符通过包含保留string.h
。
因为这就是 C 标准所说的:
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
ISO/IEC 9899:TC3 委员会草案 — 2007 年 9 月 7 日 WG14/N1256
7.19 输入/输出
<stdio.h>
7.19.1 简介
1 头文件
<stdio.h>
声明了三种类型、几个宏和许多用于执行输入和输出的函数。2 声明的类型是
size_t
(在 7.17 中描述);[...]
3 宏是
NULL
(在 7.17 中描述);
7.17 实际上是<stddef.h>
.