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合格?
这相当于承诺数据不会被更改。这个承诺没有实际执行,就像 C 中经常出现的情况一样,但不遵守这个承诺可能会导致未定义的行为。
本质上,restrict这里的限定符意味着当文件句柄有效时,没有其他指针会更改文件名或访问模式的值。以下是一个网站的摘录,内容非常好:
Restrict是程序员和编译器之间的“不会产生数据危险”的契约。编译器依赖此信息进行优化。如果数据实际上是别名,则结果是未定义的,程序员不应期望编译器输出警告。编译器假定程序员没有说谎。
那么,它为什么会在那里呢?因为,在fopen编写库函数时,作者决定要求您在要求它打开文件后不要更改传递给它的字符串。坦率地说,我不明白为什么会请求这样做,因为据我所知,一旦文件打开,只有文件描述符很重要,并且文件名和模式永远不会在内部再次引用。
| 归档时间: |
|
| 查看次数: |
243 次 |
| 最近记录: |