Точные значения ширины в C++/Qt: действительно ли typedef int qint32 действительно корректен?

Документация Qt гласит:

typedef qint8

Typedef для подписанного символа. Этот тип гарантированно будет 8-битным на всех платформах, поддерживаемых Qt.

typedef qint16

Typedef для подписанного короткого. Этот тип гарантированно будет 16-битным на всех платформах, поддерживаемых Qt.

typedef qint32

Typedef для подписанного Int. Этот тип гарантированно будет 32-битным на всех платформах, поддерживаемых Qt.

typedef qint64

Typedef для long long int (__int64 в Windows). Этот тип гарантированно будет 64-битным на всех платформах, поддерживаемых Qt.

Типы определены в 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 всегда может быть длиной 32 бита, если нет гарантии, что int длиной 32 бита. Насколько я знаю, на 64-битных архитектурах ints (или, по крайней мере, могут быть) длиной 64 бита. [Редактировать: я был не прав. Смотрите комментарии ниже.]

Как они могут гарантировать размеры? Почему они не используют stdint (и __intN на платформах Windows)?

2 ответа

Решение

Как они могут гарантировать размеры?

Они нацелены на конкретные платформы, которые, как они знают, работают вышеуказанные определения. Qt не заботится о других платформах, а другие платформы не заботятся о Qt. Так что это не всегда будет работать. Но там, где это не сработает, не будет Qt.

Почему они не используют stdint (и __intN на платформах Windows)?

Иногда проще поддерживать typedefs в <stdint.h> для вашего собственного проекта, а не условно включая стандартный заголовок на платформах, которые его имеют, и все еще сохраняют запасной вариант для платформ, которые этого не делают (например, VS2005).

Qt поддерживает многие платформы, но важна 64-битная модель данных платформы (или, возможно, более правильно, компилятор плюс модель данных платформы).

Наиболее распространенные 64-разрядные платформы используют 32-разрядные целые числа, поскольку они реализуют некоторую форму модели данных LP64. Модели данных на основе ILP64 (ILP64, SILP64 и т. Д.) Определяют целые числа как 64-битные. Но я не верю, что Qt поддерживает любую из этих платформ.

Посетите вики-страницу ILP64 и эту страницу поддержки PVS-Studio, в которой содержится хорошая техническая информация.

Другие вопросы по тегам