使用指向FILE类型的const指针是个好主意吗?

时间:2018-04-21 18:22:26

标签: c pointers file-io c-standard-library const-pointer

通常,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上按预期工作(该文件包含我期望的字符串),但是我不确定这个成语是否是一个好主意 - {{1} } type在设计上是不透明的,并且它的处理是特定于实现的。

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

1 个答案:

答案 0 :(得分:3)

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

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

  

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

     

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

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

否则,使用FILE * const无效。我认为它不是很有用。除了它没有任何益处(并且可能使人混淆)之外,它并不是有害的。我建议不要使用FILE * const