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).
我相信这个问题不会有一个明确而明显的答案,尽管这个问题不是基于观点的,因为某个地方存在一个明确的答案,尽管它是遥不可及的。
然而,我认识到这个问题的挫败感:如果除了学习函数名称及其依赖项之外,还单独记住每个函数的参数顺序,就无法轻松工作。相反,如果参数顺序一致就好了。
为了实现这一目标,可以实现一个一致的 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_可能是一个前缀,以确保名称几乎相似但不同,并且参数顺序保持一致。这样,人们只需要记住函数名称以及每个函数所依赖的内容,而不再需要单独记住每个函数的参数顺序。只要不需要微观优化,就可以使用这些方法。