C ++ / Qt中的精确宽度整数:typedef int qint32真的正确吗?

时间:2012-05-21 20:21:52

标签: c++ qt cross-platform

Qt文档说:

  

typedef qint8

     

用于签名字符的Typedef。在Qt支持的所有平台上,此类型保证为8位。

     

typedef qint16

     

用于签名短片的Typedef。在Qt支持的所有平台上,此类型保证为16位。

     

typedef qint32

     

用于signed int的Typedef。在Qt支持的所有平台上,此类型保证为32位。

     

typedef qint64

     

Typedef for long long int(Windows上为__int64)。在Qt支持的所有平台上,此类型保证为64位。

类型在qglobal.h中定义如下:

/*
   Size-dependent types (architechture-dependent byte order)
   Make sure to update QMetaType when changing these typedefs
*/
typedef signed char qint8;         /* 8 bit signed */
typedef unsigned char quint8;      /* 8 bit unsigned */
typedef short qint16;              /* 16 bit signed */
typedef unsigned short quint16;    /* 16 bit unsigned */
typedef int qint32;                /* 32 bit signed */
typedef unsigned int quint32;      /* 32 bit unsigned */
//....

但是我想知道(例如)qint32如果不能保证int是32位长,那么总是32位长。 据我所知,在64位架构上int是(或至少可以)64位长。 [编辑:我错了。见下面的评论。]

他们如何保证尺寸?他们为什么不在Windows平台上使用stdint(和__intN)?

2 个答案:

答案 0 :(得分:3)

  

他们如何保证尺寸?

他们针对特定平台,他们知道上述定义有效。 Qt不关心其他平台,other platforms不关心Qt。所以,它并不总是有效。但Qt。

也不会发挥作用
  

为什么他们不使用stdint(以及Windows平台上的__intN)?

有时在<stdint.h>中为自己的项目维护typedef更简单,而不是有条件地在包含的平台上的标准头文件中继续为不支持的平台维护(例如VS2005)。

答案 1 :(得分:1)

Qt支持许多平台,但重要的是平台的64位数据模型(或者更准确地说,是编译器加平台的数据模型)。​​

大多数常见的64位平台使用32位整数,因为它们实现了某种形式的LP64数据模型。基于ILP64的数据模型(ILP64,SILP64等)将整数定义为64位。但我不相信Qt支持这些platforms中的任何一个。

查看具有一些良好技术信息的ILP64 wiki page和此support page for PVS-Studio