【发布时间】:2021-03-01 16:26:29
【问题描述】:
我看着 source code of fread in chromium-os / glibc 并对此越来越感到困惑。
注意:我说的是源代码,而不是 fread 或 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(注册文件*流)
我对这行特别疑惑:
int c = __fillbf(stream);
并且无法在任何地方找到此功能。我认为这可能是一个我还不知道的系统调用,但它不属于the table
那么__fill_bf(register FILE *)背后的真实代码是什么?
编辑:感谢 dyp 的宏定义,Crowman 的__fillbf 和 Ray 的精彩综合解释!
ps:任何关于 fread 棘手部分的额外解释的答案也欢迎!
【问题讨论】:
-
铬,它在超链接中,抱歉我删除了``以使其更明显
-
关于 DEFUN:chromium.googlesource.com/chromiumos/third_party/glibc/+/cvs/… "它成为 ANSI C 中的原型,以及传统 C 中的类型声明。"
-
__fillbf定义在internals.c的起始行 591 -
@Crowman 谢谢!!在哪里可以找到 internals.c 的源代码?
-
请注意,
__fillbf()没有机会成为系统调用,因为FILE *仅涉及用户空间/libc。