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

时间:2016-08-02 11:53:44

标签: c language-lawyer size-t

strcpy()malloc()strlen()等各种功能接受其参数或将值返回为size_t而不是int或{ {1}}出于显而易见的原因。

某些文件功能(例如unsigned intfread())也使用fwrite()。通过扩展,可以预期size_t应该使用char* fgets (char *str, int num, FILE *stream)而不是size_t作为其缓冲区大小的参数。

但是,fgets()使用int。有没有客观的解释原因?

1 个答案:

答案 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中找到了定义,但增加了几个新功能。