为什么fgets接受int而不是size_t?
strcpy()
, malloc()
, strlen()
和其他各种函数接受它们的参数或返回值作为size_t
而不是int
或unsigned int
,原因很明显。
某些文件函数(如fread()
和fwrite()
使用size_t
。 通过扩展,可以预期char* fgets (char *str, int num, FILE *stream)
应该使用size_t
而不是int
作为其缓冲区大小的参数。
但是, fgets()
使用int
。 有客观解释为什么?
原始的K&R使用int
参数在p.155上定义了fgets()
。 本书中提供的代码也可以使用unsigned int
(它使用>0
,但是循环被编写为永远不会低于零)。
size_t
稍后在C89 (ANSI C)中作为sizeof()
的类型引入。 由于此function是为协调内存分配而专门引入的,因此内存管理function和字符串function也相应更新。 但文件I / O不是:在C89中使用size_t
的唯一文件函数是由C89引入的新函数,并且在K&R中不存在,例如fread()
/ fwrite()
。 是的,K&R没有这些function,仅依靠使用文件描述符的(非便携式)unix读/写function进行块操作。
应该注意的是, POSIX标准协调了unixfunction,它是与ANSI C标准并行开发的,并于1988年末发布 。 该标准已经统一了许多unix函数以使用size_t
因此read()
/ write()
现在用size_t
定义。 但对于C标准库函数(如fgets()
,POSIX优先于C标准(当前版本标准的措辞):
此参考页面上描述的function与ISO C标准一致。 此处描述的要求与ISO C标准之间的任何冲突都是无意的。
所以在POSIX中,具有讽刺意味的是, fgets()
仍然inheritance了历史悠久的K&R int
。
编辑:额外阅读
- 从K&R到Ansi C – Dr.Dobb’s – 1989:
stdio.h:此标头定义并原型化了K&R第7章中列出的大多数function。 K&R中的定义几乎没有变化,但增加了几个新function。