Chromium OS 中 fread 的实现是由什么构成的?

What is this implementation of fread in Chromium OS made of?

我看着source code of fread in chromium-os / glibc,越来越疑惑了。

注意:我说的是源代码,而不是 fread or other related questions

的使用

作为宏的函数原型

首先,我对 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(register FILE *stream)

我对这行特别疑惑:

int c = __fillbf(stream);

并且无法在任何地方找到此功能。我认为这可能是一个我还不知道的系统调用,但它不是 the table

的一部分

那么__fill_bf(register FILE *)背后的真正代码是什么?

编辑:感谢 dyp 的宏定义,Crowman__fillbfRay 很好的综合解释!

ps:也欢迎任何关于 fread 棘手部分的额外解释的答案!

DEFUN

在 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 中。看起来它将一块字符读入内部缓冲区,因此 fgetc 可以一次读取一个字符,而无需每次都进行磁盘访问。