为什么fgets接受int而不是size_t?

strcpy()malloc()strlen()和其他各种函数接受它们的参数或返回值作为size_t而不是intunsigned 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。