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
并且类似于第一次和最后一次)。
答案 0 :(得分:3)
我确信这个问题没有明确而明确的答案,尽管这个问题不是基于意见的,因为某个地方存在明确的答案,即使它无法实现。
但是,我认识到这个问题的挫败感:如果除了学习函数名称和它们所依赖的内容之外,还可以单独记住每个函数的参数顺序。相反,拥有一致的参数顺序会很好。
为了实现这一点,可以实现一致的stdio库,它将使用参数的一致顺序,并将每个stdio函数包装到这样的函数中。例如:
int mystdio_fseek(long, int, FILE *);
这将返回
的结果int fseek(FILE *, long, int);
因此,mystdio_
可能是一个前缀,以确保名称几乎相似,但不同,参数顺序将是一致的。这样,人们只需要记住函数名称,每个函数所依赖的内容,并且不再需要单独记住每个函数的参数顺序。只要不需要微观优化,就可以使用这些方法。