这可能听起来像一个奇怪的问题,但我可以安全地为operator<<
对象定义operator>>
或FILE
,还是会违反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;
}
答案 0 :(得分:14)
暂时忽略这是一个好主意(但事实并非如此)的问题,我们可以质疑这是否真的被允许。
C ++标准定义了所有相关的头和函数 - {27}中涵盖了<cstdio>
。如果你真的想使用它,<stdio.h>
甚至是C ++标准(§D.5)的一部分,尽管它已被正式弃用。
这往往表明它是允许的。 C标准(第7.19.1 / 2节)的措辞是:
FILE
是一种能够记录控制所需信息的对象类型 流,包括其文件位置指示器,指向其关联缓冲区的指针(如果有),记录是否发生读/写错误的错误指示符,以及文件结尾 记录是否已到达文件末尾的指示符;
问题是,FILE
是否真的需要直接表示该类型,或者可能(例如)typedef
d到void
,所以(例如){{ 1}}实际上返回fopen
。使用它的库的内部将其转换为正确的类型,但对于外部世界(即,您的程序),它是完全不透明的。特别是,如果它是void *
,则不能取消引用它,甚至不能仅仅获取引用而不是指针。
我猜这主要是理论上的。我认为一般来说,假设void *
是一个可以进行重载的唯一类型是相当安全的。你不应该假设它所指向的内部的任何内容,但你相当安全,假设你可以取消引用它来获得引用而不是指针(并且相当安全,假设过载将与其他类型的重载区分开来)如整数)。