【发布时间】:2011-06-08 01:31:02
【问题描述】:
虽然关于 reinterpret_cast 的主题写了很多行,而且它有多糟糕,但我仍然对避免它的最佳方法感到困惑,尤其是在处理像从 fstream 读取和写入这样的函数时。所以,这是我的困境......
假设我们有一个整数数组,我们想用文件中的一些数据来填充它。
std::ifstream iFile( ... );
// presume that the type of this array is not a matter of choice
int *a = new int[ 100 ];
我们可以用几个不同的演员来阅读:
iFile.read( (char *)a, sizeof( int ) * 100 );
iFile.read( reinterpret_cast< char * >( a ), sizeof( int ) * 100 );
iFile.read( static_cast< char * >( static_cast< void * >( ( a ) ), sizeof( int ) * 100 );
第一个(C 风格)已经过时,我们在 C++ 中引入了新的风格转换,这是有充分理由的。第二个是不可移植的,不提供任何保证。第三个写起来很乏味,破坏了乐趣。
有什么替代方法吗?我应该怎么做?
编辑:
我们的目标是实现代码的可移植性和尽可能符合标准。
【问题讨论】:
-
第三个是智障。我不明白为什么你不能使用 reinterpret_cast。但是,您所说的“不可移植且不提供任何保证”到底是什么意思?您指的是字节顺序,以及未来可能对 int 大小的更改吗?
-
虽然从技术上讲,
reinterpret_cast的行为无法得到保证,但这种情况正是您应该使用的。大多数实现在 C 风格转换和reinterpret_cast之间几乎没有区别。 -
可能没有定义 reinterpret_cast 的行为。但是规范还说
对于那些知道底层机器的寻址结构的人来说并不奇怪
所以假设你知道你的机器(标准PC)它应该可以工作很好。 -
@PigBen 我指的是在这种特殊情况下 reinterpret_cast 的未定义行为。我并没有推断出任何具体的实现。这就是为什么我首先提出这个问题。 @Daniel 我同意这是一个最吸引人的解决方案,并且我同意它会按预期运行(在大多数平台上)。这更像是一个理论问题。
-
@Vedran :我已经编辑了我的帖子。我想你会喜欢的。它是便携式的。 :-)
标签: c++ fstream reinterpret-cast