gpt4 book ai didi

c - Chromium OS 中的 fread 实现是由什么组成的?

转载 作者:行者123 更新时间:2023-12-03 14:31:14 26 4
gpt4 key购买 nike

我在看 source code of fread in chromium-os / glibc 并对此越来越感到困惑。
注意:我说的是源代码,而不是 fread 的使用。或 other related questions

函数原型(prototype)作为宏
首先,我对 fread 被声明为带有函数名的宏的方式感到惊讶,然后是它的参数,最后是它的参数类型:

/* Read NMEMB chunks of SIZE bytes each from STREAM into P.  */

size_t
DEFUN(fread, (p, size, nmemb, stream),
PTR p AND size_t size AND size_t nmemb AND register FILE *stream)
这背后的理由是什么,为什么不
size_t fread(PTR p, size_t size, size_t nmemb, register FILE * stream)
哪个更具可读性?

什么是__fillbf(注册文件*流)
我对这一行特别困惑:
int c = __fillbf(stream);
并且在任何地方都找不到此功能。我认为这可能是一个我还不知道的系统调用,但它不是 the table 的一部分
那么 __fill_bf(register FILE *) 背后的真实代码是什么? ?
编辑:感谢 dyp 对于宏定义, 克劳曼 对于 __fillbf为了解释的完美综合!
ps:也欢迎任何关于 fread 棘手部分的额外解释的答案!

最佳答案

德丰
在 ANSI 标准化之前,函数声明有不同的语法:
ANSI 声明:

int f(int x, double y) {
...
}
ANSI (K&R1) 前声明:
f(x, y)
int x;
double y;
{
...
}
DEFUN 这样的宏通常是为可能需要由非常旧的编译器编译的程序定义的。 (现在不太常见了,因为 ANSI 标准化发生在 1989 年。)如果使用 ANSI/ISO C,将有一个文件以一种方式定义宏,如果使用 pre-ANSI C,则以另一种方式定义宏。(对于 chromiumos,这将是 ansidecl.h .) DEFUN 调用将因此扩展为正在使用的编译器的适当 decl 格式。
__fillbf
正如 Crowman 在评论中提到的, __fillbf 的定义在 internals.c 中。似乎它将一个字符 block 读入内部缓冲区,因此 fgetc 可以一次读取一个字符,而无需每次都进行磁盘访问。

关于c - Chromium OS 中的 fread 实现是由什么组成的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66425858/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com