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

时间:2016-02-24 09:05:24

标签: 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);

虽然有些人将其作为第一个论点:

int      fgetpos(FILE *restrict, fpos_t *restrict);
int      fseek(FILE *, long, int);

为何这种不一致?这些功能是在标准库演变的不同时间添加的吗?在那个第一个案例中,为什么公约会改变?

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

1 个答案:

答案 0 :(得分:3)

我确信这个问题没有明确而明确的答案,尽管这个问题不是基于意见的,因为某个地方存在明确的答案,即使它无法实现。

但是,我认识到这个问题的挫败感:如果除了学习函数名称和它们所依赖的内容之外,还可以单独记住每个函数的参数顺序。相反,拥有一致的参数顺序会很好。

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

int      mystdio_fseek(long, int, FILE *);

这将返回

的结果
int      fseek(FILE *, long, int);

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