为什么 fgets 接受 int 而不是 size_t?
Why does fgets accept an int instead of a size_t?
strcpy()
、malloc()
、strlen()
等函数和其他各种函数接受它们的参数或 return 值作为 size_t
而不是 int
或 unsigned int
原因显而易见。
fread()
和 fwrite()
等一些文件函数也使用 size_t
。通过扩展,预计 char* fgets (char *str, int num, FILE *stream)
应该使用 size_t
而不是 int
作为其缓冲区大小的参数。
但是,fgets()
使用 int
。有什么objective解释为什么吗?
最初的 K&R 在第 155 页用 int
参数定义了 fgets()
。书中提供的代码本来可以工作
也有一个 unsigned int
(它使用一个 >0
,但是循环被写成永远不会低于零)。
size_t
后来在 C89 (ANSI C) 中作为 sizeof()
的类型引入。由于此功能是专门为协调内存分配而引入的,内存
管理功能和字符串功能已相应更新。但是文件 I/O 不是:在 C89 中使用 size_t
的唯一文件函数是那些新函数
由 C89 引入,在 K&R 中不存在,例如 fread()
/fwrite()
。是的,K&R 没有这些功能
并且仅依赖于使用文件描述符的(不可移植的)unix read/write 函数的 bloc 操作。
需要注意的是POSIX standard,统一了unix的功能,是并行开发的
ANSI C 标准和 issued late 1988。该标准协调了许多 unix 函数以使用 size_t
以便如今 read()
/write()
用 size_t
定义。但是对于C标准库函数如fgets()
,POSIX优先于C标准
(当前版本标准的措辞):
The functionality described on this reference page is aligned with the ISO C standard.
Any conflict between the requirements described here and the ISO C standard is unintentional.
所以在 POSIX 中,具有讽刺意味的是,fgets()
仍然继承了其历史 K&R int
。
编辑:补充阅读
- Going from K&R to Ansi C - Dr.Dobb 的 - 1989:
stdio.h: This header defines and prototypes most of the functions listed in Chapter 7 of K&R. Few, if any, changes were made in the
definitions found in K&R but several new functions have been added.
strcpy()
、malloc()
、strlen()
等函数和其他各种函数接受它们的参数或 return 值作为 size_t
而不是 int
或 unsigned int
原因显而易见。
fread()
和 fwrite()
等一些文件函数也使用 size_t
。通过扩展,预计 char* fgets (char *str, int num, FILE *stream)
应该使用 size_t
而不是 int
作为其缓冲区大小的参数。
但是,fgets()
使用 int
。有什么objective解释为什么吗?
最初的 K&R 在第 155 页用 int
参数定义了 fgets()
。书中提供的代码本来可以工作
也有一个 unsigned int
(它使用一个 >0
,但是循环被写成永远不会低于零)。
size_t
后来在 C89 (ANSI C) 中作为 sizeof()
的类型引入。由于此功能是专门为协调内存分配而引入的,内存
管理功能和字符串功能已相应更新。但是文件 I/O 不是:在 C89 中使用 size_t
的唯一文件函数是那些新函数
由 C89 引入,在 K&R 中不存在,例如 fread()
/fwrite()
。是的,K&R 没有这些功能
并且仅依赖于使用文件描述符的(不可移植的)unix read/write 函数的 bloc 操作。
需要注意的是POSIX standard,统一了unix的功能,是并行开发的
ANSI C 标准和 issued late 1988。该标准协调了许多 unix 函数以使用 size_t
以便如今 read()
/write()
用 size_t
定义。但是对于C标准库函数如fgets()
,POSIX优先于C标准
(当前版本标准的措辞):
The functionality described on this reference page is aligned with the ISO C standard. Any conflict between the requirements described here and the ISO C standard is unintentional.
所以在 POSIX 中,具有讽刺意味的是,fgets()
仍然继承了其历史 K&R int
。
编辑:补充阅读
- Going from K&R to Ansi C - Dr.Dobb 的 - 1989:
stdio.h: This header defines and prototypes most of the functions listed in Chapter 7 of K&R. Few, if any, changes were made in the definitions found in K&R but several new functions have been added.