为什么stdio中的某些函数将流作为最后一个参数?

sky*_*ing 10 c libc

stdio中的一些函数似乎将流作为最后一个参数,例如:

char    *fgets(char *restrict, int, FILE *restrict);
int      fputs(const char *restrict, FILE *restrict);
size_t   fread(void *restrict, size_t, size_t, FILE *restrict);
size_t   fwrite(const void *restrict, size_t, size_t, FILE *restrict);
Run Code Online (Sandbox Code Playgroud)

有些人将它作为第一个论点:

int      fgetpos(FILE *restrict, fpos_t *restrict);
int      fseek(FILE *, long, int);
Run Code Online (Sandbox Code Playgroud)

为什么这种不一致?这些功能是在标准库演变的不同时间添加的吗?在那种情况下,这是第一次,为什么公约改变了?

我意识到,由于省略号(并且类似于首先和最后),fprintf与朋友一起或多或少地需要FILE*第一个(或至少早期fclose).

Laj*_*pad 3

我相信这个问题不会有一个明确而明显的答案,尽管这个问题不是基于观点的,因为某个地方存在一个明确的答案,尽管它是遥不可及的。

然而,我认识到这个问题的挫败感:如果除了学习函数名称及其依赖项之外,还单独记住每个函数的参数顺序,就无法轻松工作。相反,如果参数顺序一致就好了。

为了实现这一目标,可以实现一个一致的 stdio 库,该库将使用一致的参数顺序,并将每个 stdio 函数包装到这样的函数中。例子:

int      mystdio_fseek(long, int, FILE *);
Run Code Online (Sandbox Code Playgroud)

这将返回结果

int      fseek(FILE *, long, int);
Run Code Online (Sandbox Code Playgroud)

因此,mystdio_可能是一个前缀,以确保名称几乎相似但不同,并且参数顺序保持一致。这样,人们只需要记住函数名称以及每个函数所依赖的内容,而不再需要单独记住每个函数的参数顺序。只要不需要微观优化,就可以使用这些方法。

  • C 函数参数顺序的事实上的标准通常是(从左到右):目标、源(如果适用)、其他内容。(例如`memcpy`/`strcpy`的参数顺序就非常规范)。如果坚持这一点,那么“fseek”的顺序是正确的,“fprintf(FILE*...”的顺序是正确的,而其他函数的顺序是错误的。 (5认同)