5

通常,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;
}

这编译得很好,并且使用 GCC 在 Ubuntu/Linux 16.04 上按预期工作(该文件包含我期望的字符串),但我不确定这个成语是否是一个好主意——该FILE类型在设计和处理上是不透明的是特定于实现的。

因为不能保证任何 C 库实现都不会尝试更改FILE指针的地址,所以在 C 中执行 I/O 时不使用这种方法是否更安全?

4

1 回答 1

6

根据要求将评论转换为答案。

你可以FILE * const理智地使用;你不能const FILE *理智地使用。可以保证,C 库中的任何函数都不会FILE *以调用代码可检测到的任何方式修改您传递给它们的指针部分,因为指针总是按值传递 - 而不是指针的地址。所以调用代码没有办法修改你的指针——除非它为了这样做而去到极其复杂的步骤,而且它不会这样做,因为这样做既没有任何必要也没有任何好处。

我知道和之间的区别FILE * constconst FILE *以及为什么后者没有任何意义)。在我的问题中,我试图澄清使指针 const 是否会对标准库函数产生任何负面影响,因为它们的原型中没有 const 指针。

此外,对于我为什么要这样做的上下文 - 与可能将任何其他指针设为 const 的原因相同:停止意外重新分配它所指向的内容。

它对库中的函数没有任何影响;他们被传递了一个值的副本,他们不会修改该值,但不会意识到原始值无论如何都是不可修改的,并且不会在意。使用FILE * const fp = fopen(…);简单意味着您不能将该文件指针重用于同一函数中的任何其他内容(或重试打开不同的文件名或调用不同的“打开”函数),并且您不能在它之后将fclose()其重置为 NULL。当然,如果指针因为在循环内而超出范围,则可以在重新进入范围时重用它。

否则,使用FILE * const无效。我不认为它有用。它没有害处,只是它没有任何好处(并且可能会使人们感到困惑)。我建议不要使用FILE * const.

于 2018-04-21T18:45:22.277 回答