c - 为什么 fopen 参数限制在 C 标准和 <stdio.h> 头文件中限定?

标签 c language-lawyer libc

标准库函数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);

我能理解为什么实现者有资格 streambuf使用 restrict 关键字告诉编译器对 FILE 的修改setbuf范围内结构对buf的内容没有影响反之亦然。

fopen 的实现可能也是如此程序员告诉编译器 FILE fopen 操纵的结构不与文件名重叠,也不与模式重叠。但同时符合条件 filenamemode是一个错误的 promise ,因为它暗示了标准中不存在的约束。

我的结论是restrict函数声明原型(prototype)中的限定参数是不必要的并且具有欺骗性。它会降低可读性并导致错误的解释。

关于c - 为什么 fopen 参数限制在 C 标准和 <stdio.h> 头文件中限定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35386426/

相关文章:

c - glibc 中的暂存缓冲区是什么意思?

c++ - 是否有用于检测 USB 过流的 Windows API?

C - 为字符串分配空间时出现段错误

c - WAP 冒泡排序的 C 程序

c++ - 将int的所有字节都设置为(unsigned char)0,保证代表零?

c - posix regcomp 和 regexec 线程安全吗?具体来说,在 GNU libc 上?

无法弄清楚为什么这个函数永远不会返回正确的结果

c++ - 使用花括号初始化列表调用显式构造函数 : ambiguous or not?

c++ - 即使实例化不是 constexpr,声明为 constexpr 的模板函数是否始终内联?

c - 当线程卡在 64 位主机上的 syscall 32 位程序中时进行调试