Если вы хотите использовать Qt , вы должны принять quint8
, quint16
и так далее.
Если вы хотите использовать GLib , вы должны приветствовать guint8
, guint16
и так далее.
В Linux есть u32
, s16
и так далее.
УНЦ / OS определяет SINT32
, UINT16
и так далее.
И если вам нужно использовать какую-то комбинацию этих вещей, вам лучше быть готовым к неприятностям. Потому что на вашей машине u32
будет typedef
d над long
и quint32
будет typedef
d над int
и компилятор будет жаловаться .
Почему все это делают, если есть <stdint.h>
? Это какая-то традиция для библиотек?
stdint.h
было изобретено.sizeof(int) * CHAR_BIT
(например) и не использовать это? Если вашint
слишком мал, чтобы представлять ваш диапазон (например, индекс массива), то вам почти наверняка не следует использовать вint
любом случае, но что-то вродеsize_t
. Вint32
чем смысл большего? Единственная фиксированная ширина имеет смысл для связи между системами (например, файловый / сетевой формат) ...uint16_t
(или, может быть, егоfast
илиleast
вариант). Я хочу сказать, что эти типы удобны в использовании и имеют свою причину существования.size_t
и / илиuint64_t
.Ответы:
stdint.h
не существовало, когда эти библиотеки разрабатывались. Таким образом, каждая библиотека создала свой собственныйtypedef
файл s.источник
Для более старых библиотек это необходимо, потому что рассматриваемый заголовок (
stdint.h
) не существует.Однако по-прежнему существует проблема: эти типы (
uint64_t
и другие) являются необязательной функцией в стандарте. Таким образом, соответствующая реализация может не поставляться с ними - и, таким образом, вынудить библиотеки по-прежнему включать их в настоящее время.источник
uintN_t
типы не являются обязательными, ноuint_leastN_t
иuint_fastN_t
типы не являются.stdint.h
был стандартизирован с 1999 года. Более вероятно, что многие приложения определяют (фактически псевдонимы) типы, чтобы поддерживать частичную независимость от базовой машинной архитектуры.Они обеспечивают разработчикам уверенность в том, что типы, используемые в их приложении, соответствуют их конкретным предположениям о поведении проекта, которые могут не соответствовать ни стандарту языка, ни реализации компилятора.
Практика отражена в объектно-ориентированном фасаде. шаблон проектирования и много злоупотреблений со стороны разработчиков неизменно пишут обертку классы для всех импортируемых библиотек.
Когда компиляторы были гораздо менее стандартными, а архитектура машин могла варьироваться от 16-битных, 18-битных до 36-битных мэйнфреймов с длиной слова, это было гораздо более важным вопросом. В настоящее время эта практика гораздо менее актуальна в мире, стремящемся к использованию 32-разрядных встроенных систем ARM. Это остается проблемой для младших микроконтроллеров с нечетными картами памяти.
источник
stdint.h
стандартизован с 1999 года, но как долго он доступен на практике? Люди медленно внедряют и принимают новые стандарты, и в течение этого длительного переходного периода старые методы все еще необходимы.stdint.h
заключается в том, что даже на платформах, где, например,long
иint32_t
есть тот же размер и представление, нет требования, чтобы приведениеint32_t*
кlong*
получению указателя, которое может надежно получить доступ кint32_t
. Я не могу поверить, что авторы Стандарта считали очевидным, что типы, совместимые с макетом, должны быть совместимы с псевдонимами, но поскольку они не удосужились сказать об этом, авторы gcc и IIRC clang считают, что язык будет улучшен, если игнорировать псевдонимы даже в случаях, когда это очевидно.-fno-strict-alias
, но который все равно действительно работал бы. Даже если бы не существовало кодовой базы, ни один набор правил не смог бы обеспечить оптимальный баланс оптимизации и семантики для всех приложений, потому что у разных приложений разные потребности. Добавьте существующую кодовую базу, и необходимость в разных режимах станет очевидной.Итак, у вас есть возможность typedef char в int.
В одном из «ужасов кодирования» упоминалось, что в заголовке одной компании есть точка, в которой программисту требуется логическое значение, а символ является логическим собственным типом для работы, и так написал
typedef bool char
. Позже кто-то нашел, что целое число является наиболее логичным выбором, и написалtypedef bool int
. Результат, задолго до появления Unicode, был фактическиtypedef char int
.Думаю, довольно много дальновидности и совместимости.
источник