sax*_*one 5 c file-io pointers const-pointer c-standard-library
通常,C 文件 I/O 是使用完成的,FILE*因为这是标准库函数都采用的。
在 C 中,也可以有一个const 指针,指针的地址不能改变(但它指向的值可以)。
我想知道这是否可以应用于FILE*,所以写了这个小程序来测试这个:
#include <stdio.h>
int main(void) {
FILE* const file = fopen("somefile.txt", "w");
if (file != NULL) {
fprintf(file, "%s\n", "So this works? That's just swell!");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这可以很好地编译并使用 GCC 在 Ubuntu/Linux 16.04 上按预期工作(该文件包含我预期的字符串),但我不确定这个习语是否是一个好主意 - 该FILE类型在设计和处理上是不透明的是特定于实现的。
因为不能保证任何 C 库实现都不会尝试更改FILE指针的地址,所以在 C 中执行 I/O 时不使用这种方法是否更安全?
根据要求将评论转换为答案。
您可以FILE * const放心使用;你不能const FILE *理智地使用。有一个保证,C 库中的任何函数都不会FILE *以调用代码可检测到的任何方式修改您传递给它们的指针部分,因为指针总是按值传递——而不是指针的地址。因此,调用代码无法修改您的指针——除非它执行极其复杂的步骤才能这样做,而且不会这样做,因为这样做既没有任何必要也没有任何好处。
我知道之间的差异
FILE * const和const FILE *(以及为什么后者没有任何意义)。在我的问题中,我试图澄清使指针为 const 是否会对标准库函数产生任何负面影响,因为它们的原型中不采用 const 指针。此外,对于我为什么要这样做的上下文 - 可能使任何其他指针为 const 的相同原因:停止对其指向的意外重新分配。
不能对库中的函数产生任何影响;他们被传递了一个值的副本,他们不会修改该值,但不会意识到原始值无论如何都是不可修改的,并且不会在意。FILE * const fp = fopen(…);简单地使用意味着您不能将该文件指针重用于同一函数中的任何其他内容(或重试打开不同的文件名或调用不同的“打开”函数),并且您不能在fclose()它之后将其重置为 NULL 。当然,如果指针因为在循环内而超出作用域,当重新进入作用域时,它可以被重用。
否则,使用FILE * const无效。我不认为它有用。它无害,只是它没有任何好处(并且可能会使人们感到困惑)。我建议不要使用FILE * const.