我正在跨平台环境中使用 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
为 aunsigned int
并且不使用unsigned long
整数。Uint32
然而,另一个库将其定义为unsigned long
. 因此,两者实际上都是 32 位无符号整数,但具有不同的原始数据类型。
现在,碰巧的是,我们尝试使用为数据QDataStream
定义的序列化,令我们惊讶的是(或没有),Visual C++ 抱怨没有为它定义的操作符是真的,因为 Qt 使用了几乎等价的代替。quint32
Uint32
QDataStream
unsigned long
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
是,据我所知,数据类型实际上是相同的。这里有龙?