Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么我需要重新解释“long&;”的演员阵容至'int&;`其中两者都是32位(Windows LLP64)?_C++_Windows_Qt_Casting_Qdatastream - Fatal编程技术网

C++ 为什么我需要重新解释“long&;”的演员阵容至'int&;`其中两者都是32位(Windows LLP64)?

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序列化,它

我在跨平台环境中使用Qt。我们遇到了以下问题:在Windows上,
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()
,我选择了您的解决方案和条件赋值。