是否可以为 FILE&<< 定义运算符或运算符>>?
Is it OK to define operator<< or operator>> for FILE&?
这可能听起来像一个奇怪的问题,但是我在为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
是一个唯一的类型,你可以做重载是相当安全的。您不应该对它所指向的对象的内部进行任何假设,但是如果您可以对其解引用以获得引用而不是指针,则相当安全(并且假设重载将与其他类型(如整数)的重载不同,则相当安全)。
相关文章:
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 是否需要使用 - &gt;运算符在C 中调用成员函数时