C++ 为什么我需要重新解释“long&;”的演员阵容至'int&;`其中两者都是32位(Windows LLP64)?
我在跨平台环境中使用Qt。我们遇到了以下问题:在Windows上,C++ 为什么我需要重新解释“long&;”的演员阵容至'int&;`其中两者都是32位(Windows LLP64)?,c++,windows,qt,casting,qdatastream,C++,Windows,Qt,Casting,Qdatastream,我在跨平台环境中使用Qt。我们遇到了以下问题:在Windows上,int和long int都是32位整数;在64位MacOS和Linux上,int为32位,long int为64位(请参阅) 因此,跨平台库倾向于提供自己的固定位typedef。在Windows上,Qt将quint32定义为无符号整数,不使用无符号长整数。另一个库将其Uint32定义为unsigned long。因此,这两个事实上都是32位无符号整数,但具有不同的基本数据类型 现在,我们碰巧尝试使用QDataStream序列化,它
int
和long int
都是32位整数;在64位MacOS和Linux上,int
为32位,long int
为64位(请参阅)
因此,跨平台库倾向于提供自己的固定位typedef。在Windows上,Qt将quint32
定义为无符号整数
,不使用无符号长整数。另一个库将其Uint32
定义为unsigned long
。因此,这两个事实上都是32位无符号整数,但具有不同的基本数据类型
现在,我们碰巧尝试使用QDataStream
序列化,它是为quint32
定义的,与Uint32
数据一起使用,这让我们感到惊讶(或者不是),VisualC++对<代码> qDATASTRAM < /代码>抱怨:未为<代码>未签名的长< /COD>定义操作符,这是正确的,因为QT使用了几乎等效的<代码>无符号int < /C>。
好的,解决办法是提供
#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
#ifdef Q#u OS#u WIN
内联QDataStream和运算符>>(QDataStream和stream、Uint32和值)
{返回流>>重新解释强制转换(值);}
内联QDataStream和运算符int
和long
是不同的数据类型,即使它们碰巧具有相同的属性
由于严格的别名冲突,您的操作符>>
导致未定义的行为;编写代码的正确方法是:
inline QDataStream & operator >> (QDataStream & stream, Uint32 & value)
{
quint32_t v;
stream >> v;
value = v;
return stream;
}
(注意:我假设QDataStream>>具有与C++11 istream>>相同的属性,即在读取失败时将值设置为0
;如果不是,则需要包含一个分支,以便在读取失败时不执行value=v;
)
您可以对操作符使用static\u cast
,实际上,这些是在uint32\u t
出现之前就开始处理这些问题的项目,我认为。。。关于在失败时跳过设置,您应该在分配之前添加if(QDataStream::Ok==stream.status())
。谢谢你的回答!有没有办法避免临时和临时任务?这看起来太没用了。。。在这里使用了一种类似的联合?混叠是标准C++中的未定义行为。(在C中是允许的)。取决于你是否想依赖未定义的行为当然不是。。。根据stream.status()
,我选择了您的解决方案和条件赋值。