是否可以为 FILE&<< 定义运算符或运算符>>?

Is it OK to define operator<< or operator>> for FILE&?

本文关键字:gt 运算符 lt 定义 是否 FILE      更新时间:2023-10-16

这可能听起来像一个奇怪的问题,但是我在为FILE对象定义operator<<operator>>时是否安全,或者我是否违反了C或c++标准中的潜在条款,或者它可能导致其他问题?

(是的,我确实知道c++ I/O流。我不是问这是不是一个主意。我在问是否允许)

的例子:

#include <stdio.h>
FILE &operator>>(FILE &file, int &d)
{
    if (fread(&d, sizeof(d), 1, &file) != 1)
    { throw "I/O error"; }
    return file;
}
int main()
{
    int x;
    FILE *file = fopen("File.bin", "rb");
    *file >> x;
    fclose(file);
    return x;
}

暂时忽略这是否是一个好主意的问题(但它不是),这是否真的被允许是一个开放的问题。

c++标准定义了所有相关的头和函数——<cstdio>在§27.9.2中被覆盖。如果你真的想使用它,<stdio.h>甚至是c++标准的一部分(§D.5),尽管它已被官方弃用。

表示它是允许的。C标准(§7.19.1/2)的措辞是:

        FILE

是一种对象类型,能够记录控制a所需的所有信息流,包括它的文件位置指示器,一个指向它的关联缓冲区的指针(如果有的话),一个记录是否发生了读/写错误的错误指示器,以及一个文件结束符记录文件是否到达终点的指示器;

问题是是否真的需要FILE来直接表示该类型,或者(例如)可以是typedef d到void,因此(例如)fopen实际上返回void *。使用它的库内部会将其转换为正确的类型,但对外部世界(即您的程序)来说,它是完全不透明的。特别是,如果它是void *,则不能对其解引用,甚至不能只获得引用而不是指针。

我想这主要是理论上的。我认为在一般情况下,假设FILE是一个唯一的类型,你可以做重载是相当安全的。您不应该对它所指向的对象的内部进行任何假设,但是如果您可以对其解引用以获得引用而不是指针,则相当安全(并且假设重载将与其他类型(如整数)的重载不同,则相当安全)。