任何人都可以告诉我如何使这个C代码在C++中工作吗?
uint64_t flv_dbl2int( double value )
{
return (union {double f; uint64_t i;}){value}.i;
}
Run Code Online (Sandbox Code Playgroud)
我不确定发生了什么,是否有点转变?
据我所知,C++中打字类型的唯一法律策略是通过memcpy(),即
uint64_t flv_dbl2int(double fvalue)
{
uint64_t ivalue;
memcpy(&ivalue, &fvalue, sizeof ivalue);
return ivalue;
}
Run Code Online (Sandbox Code Playgroud)
使用的直接解决方案 reinterpret_cast
uint64_t flv_dbl2int(double value)
{
return reinterpret_cast<uint64_t&>(value);
}
Run Code Online (Sandbox Code Playgroud)
实际上是未定义的行为,与使用C风格的指针强制转换相同.
使用联合(作为原始解决方案),虽然在C中合法,但在C++中可能是非法的.在实践中,所有这些解决方案都可能有效,并且至少gcc-4.5.3和clang-3.0将在x86上生成相同的代码-O1.