strcpy()
,malloc()
,strlen()
等各种功能接受其参数或将值返回为size_t
而不是int
或{ {1}}出于显而易见的原因。
某些文件功能(例如unsigned int
和fread()
)也使用fwrite()
。通过扩展,可以预期size_t
应该使用char* fgets (char *str, int num, FILE *stream)
而不是size_t
作为其缓冲区大小的参数。
但是,fgets()
使用int
。有没有客观的解释原因?
答案 0 :(得分:9)
原始K& R在第155页上使用fgets()
参数定义int
。书中提供的代码可行
同时使用unsigned int
(它使用>0
,但是循环被编写为永远不会低于零)。
size_t
稍后在C89(ANSI C)中作为sizeof()
的类型介绍。由于此功能专门用于协调内存分配,内存
管理功能和字符串功能相应更新。但是文件I / O不是:在C89中使用size_t
的唯一文件函数是那些新函数
由C89引入并且在K& R中不存在,例如fread()
/ fwrite()
。是的,K& R没有这些功能
并且仅依赖于使用文件描述符的(非可移植)unix读/写函数的bloc操作。
应该注意的是,协调unix功能的POSIX standard是与...并行开发的
ANSI C标准和issued late 1988。该标准已将许多unix函数统一起来使用size_t
,以便现在read()
/ write()
用size_t
定义。但是对于诸如fgets()
的C标准库函数,POSIX优先于C标准
(当前版本标准的措辞):
此参考页面上描述的功能与ISO C标准一致。 此处描述的要求与ISO C标准之间的任何冲突都是无意的。
所以在POSIX中,具有讽刺意味的是,fgets()
仍然继承了历史悠久的K& R int
。
编辑:额外阅读
stdio.h:此标题定义并原型化了K& R第7章中列出的大部分功能。很少,如果有的话,改变了 在K& R中找到了定义,但增加了几个新功能。