【发布时间】:2018-04-30 14:37:30
【问题描述】:
我正在跨平台环境中使用 Qt。我们遇到了以下问题:在 Windows 上,int 和 long int 都是 32 位整数;在 64 位 MacOS 和 Linux 上,int 是 32 位,long int 是 64 位(请参阅https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models)。
因此,跨平台库倾向于提供自己的固定位类型定义。在 Windows 上,Qt 将 quint32 定义为 unsigned int 并且不使用 unsigned long 整数。另一个库将其Uint32 定义为unsigned long。因此,两者实际上都是 32 位无符号整数,但具有不同的原始数据类型。
现在,我们尝试使用为quint32 定义的Uint32 数据和Uint32 数据的QDataStream 序列化,令我们惊讶(或没有),Visual C++ 抱怨QDataStream 运算符未定义对于unsigned long,这是正确的,因为Qt 使用了几乎等效的unsigned int。
好的,解决方法是提供
#ifdef Q_OS_WIN
inline QDataStream & operator >> (QDataStream & stream, Uint32 & value)
{ return stream >> reinterpret_cast<quint32 &>(value); }
inline QDataStream & operator << (QDataStream & stream, Uint32 value)
{ return stream << quint32(value); }
#endif // def Q_OS_WIN
我的问题是:为什么我需要reinterpret_cast?我对static_cast 感觉更舒服,因为据我了解,数据类型实际上是相同的。这里有龙吗?
【问题讨论】:
标签: c++ windows qt casting qdatastream