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

chq*_*lie 11 c libc language-lawyer

标准库函数fopen声明<stdio.h>为:

FILE *fopen(const char * restrict filename, const char * restrict mode);
Run Code Online (Sandbox Code Playgroud)

这也是函数原型在C标准中的出现方式.

为什么论证restrict合格?

Dav*_*zer 1

这相当于承诺数据不会被更改。这个承诺没有实际执行,就像 C 中经常出现的情况一样,但不遵守这个承诺可能会导致未定义的行为。

本质上,restrict这里的限定符意味着当文件句柄有效时,没有其他指针会更改文件名或访问模式的值。以下是一个网站的摘录,内容非常好:

Restrict是程序员和编译器之间的“不会产生数据危险”的契约。编译器依赖此信息进行优化。如果数据实际上是别名,则结果是未定义的,程序员不应期望编译器输出警告。编译器假定程序员没有说谎。

那么,它为什么会在那里呢?因为,在fopen编写库函数时,作者决定要求您在要求它打开文件后不要更改传递给它的字符串。坦率地说,我不明白为什么会请求这样做,因为据我所知,一旦文件打开,只有文件描述符很重要,并且文件名和模式永远不会在内部再次引用。

  • 我同意你的最后一点:*我不明白为什么会要求这样做*。我更进一步,假装这甚至不是作者的意图,也不是“restrict”关键字在这种情况下的实际含义。 (2认同)