Los enteros de ancho exacto en C ++ / Qt: ¿Es typedef int qint32 realmente correcto?

La documentación de Qt dice:

typedef qint8

Typedef para char firmado. Se garantiza que este tipo será de 8 bits en todas las plataformas compatibles con Qt.

typedef qint16

Typedef para corto firmado. Se garantiza que este tipo será de 16 bits en todas las plataformas compatibles con Qt.

typedef qint32

Typedef para int firmado. Se garantiza que este tipo será de 32 bits en todas las plataformas compatibles con Qt.

typedef qint64

Typedef para long long int (__int64 en Windows). Se garantiza que este tipo será de 64 bits en todas las plataformas compatibles con Qt.

Los tipos se definen en qglobal.h siguiente manera:

 /* 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 */ //.... 

Pero me pregunto cómo (por ejemplo) qint32 siempre puede tener una longitud de 32 bits cuando no hay garantía de que int tenga una longitud de 32 bits. Por lo que sé, en architectures de 64 bits los int son (o al menos pueden tener) 64 bits de longitud. [EDIT: estaba equivocado. Ver comentarios a continuación.]

¿Cómo pueden garantizar los tamaños? ¿Por qué no usan stdint (y __intN en plataformas de Windows)?

¿Cómo pueden garantizar los tamaños?

Se dirigen a plataformas específicas que saben que las definiciones anteriores funcionan. Qt no se preocupa por otras plataformas y otras plataformas no se preocupan por Qt. Por lo tanto, no siempre funcionará. Pero donde no funcionará tampoco Qt.

¿Por qué no usan stdint (y __intN en plataformas de Windows)?

A veces es más sencillo mantener los typedefs en para su propio proyecto en lugar de incluir condicionalmente el encabezado estándar en las plataformas que lo tienen y aún así mantener un respaldo para las plataformas que no lo hacen (por ejemplo, VS2005).

Qt admite muchas plataformas, pero lo que importa es el modelo de datos de 64 bits de la plataforma (o probablemente más correctamente, el modelo de datos del comstackdor más la plataforma).

Las plataformas de 64 bits más comunes utilizan enteros de 32 bits porque implementan alguna forma del modelo de datos LP64. Los modelos de datos basados ​​en ILP64 (ILP64, SILP64, etc.) definen los ints como de 64 bits. Pero no creo que Qt sea compatible con ninguna de estas plataformas .

Visite la página wiki de ILP64 y esta página de soporte para PVS-Studio que tiene buena información técnica.