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