标准库函数fopen
在 <stdio.h>
中声明作为:
FILE *fopen(const char * restrict filename, const char * restrict mode);
这也是函数原型(prototype)在 C 标准中的出现方式。
为什么争论restrict
合格?
最佳答案
fopen
似乎没有任何令人信服的理由参数为 restrict
在原型(prototype)中合格 <stdio.h>
.
restrict
限定一个指针是程序员的一个 promise ,即该指针指向的对象只能通过这个指针和给定范围内基于它的任何其他指针访问。
在函数原型(prototype)中,这样的 promise 是没有实际意义的。
Nate Eldredge 给出的解释是,这意味着不允许文件名和模式指向同一个字符串。但这种说法似乎无关紧要,这种约束是不必要的,在 fopen
的定义中也没有提到。在 C 标准的第 7.21.5.3 节中。
setbuf
的原型(prototype)具有相同的restrict
其参数的限定符:
void setbuf(FILE * restrict stream, char * restrict buf);
我能理解为什么实现者有资格 stream
和 buf
使用 restrict 关键字告诉编译器对 FILE
的修改setbuf
范围内结构对buf
的内容没有影响反之亦然。
fopen
的实现可能也是如此程序员告诉编译器 FILE
fopen
操纵的结构不与文件名重叠,也不与模式重叠。但同时符合条件 filename
和 mode
是一个错误的 promise ,因为它暗示了标准中不存在的约束。
我的结论是restrict
函数声明原型(prototype)中的限定参数是不必要的并且具有欺骗性。它会降低可读性并导致错误的解释。
关于c - 为什么 fopen 参数限制在 C 标准和 <stdio.h> 头文件中限定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386426/