功能如 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定义 fgets()
在第155页上 int
论据。书中提供的代码可行
与 unsigned int
同样(它使用了一个 >0
,但循环被写入,以便永远不会低于零)。
size_t
后来介绍了 C89 (ANSI C),作为类型 sizeof()
。由于此功能专门用于协调内存分配,内存
管理功能和字符串功能相应更新。但文件I / O不是:唯一使用的文件函数 size_t
在C89中是那些新的
由C89引入并且例如在K&R中不存在 fread()
/fwrite()
。是的,K&R没有这些功能
并且仅依赖于使用文件描述符的(非可移植)unix读/写函数的bloc操作。
应该指出的是 POSIX标准,协调了unix功能,与...并行开发
ANSI C标准和 1988年末发行。该标准已经统一了许多unix函数 size_t
以便 read()
/write()
如今
定义为 size_t
。但对于C标准库等功能 fgets()
,POSIX优先于C标准
(当前版本标准的措辞):
此参考页面上描述的功能与ISO C标准一致。
此处描述的要求与ISO C标准之间的任何冲突都是无意的。
所以在POSIX中,具有讽刺意味的是, fgets()
仍然继承了历史悠久的K&R int
。
编辑:额外阅读
stdio.h中: 该标题定义并原型化了K&R第7章中列出的大多数功能。很少,如果有的话,改变了
在K&R中找到了定义,但增加了几个新功能。