Ответ 1
stdint.h
не существовало, когда эти библиотеки разрабатывались. Поэтому каждая библиотека создала свой собственный typedef
s.
Если вы хотите использовать Qt, вы должны принять quint8
, quint16
и т.д.
Если вы хотите использовать GLib, вам нужно приветствовать guint8
, guint16
и т.д.
В Linux есть u32
, s16
и т.д.
uC/OS определяет SINT32
, UINT16
и т.д.
И если вам нужно использовать какую-то комбинацию этих вещей, вам лучше подготовиться к неприятностям. Потому что на вашей машине u32
будет typedef
d поверх long
, а quint32
будет typedef
d поверх int
, и компилятор будет жаловаться.
Почему все это делают, если есть <stdint.h>
? Это какая-то традиция для библиотек?
stdint.h
не существовало, когда эти библиотеки разрабатывались. Поэтому каждая библиотека создала свой собственный typedef
s.
Для более старых библиотек это необходимо, потому что заголовок, о котором идет речь (stdint.h
), не существует.
Тем не менее, существует проблема: эти типы (uint64_t
и другие) являются необязательной функцией в стандарте. Таким образом, совместимая реализация может не поставляться с ними - и, таким образом, заставить библиотеки по-прежнему включать их в настоящее время.
stdint.h
стандартизирован с 1999 года. Скорее всего, многие приложения определяют (эффективно псевдоним) типы, чтобы поддерживать частичную независимость от базовой архитектуры машины.
Они предоставляют разработчикам уверенность в том, что типы, используемые в их приложении, соответствуют их предположениям по конкретному проекту, которые могут не соответствовать языковым стандартам или реализации компилятора.
Практика зеркалируется в объектно-ориентированном шаблоне дизайна Фасад и сильно злоупотребляет разработчиками, неизменно пишущими классы-оболочки для всех импортированных библиотек.
Когда требования были гораздо менее стандартными, а машинные архитектуры могли варьироваться от 16 бит, 18-бит через 36-бит мейнфреймы длины слов это было гораздо более важным. Практика гораздо менее актуальна сейчас в мире, сходящемся на 32-битных встроенных системах ARM. Он по-прежнему вызывает озабоченность у младших микроконтроллеров с картами памяти нечетные.
Таким образом, у вас есть возможность typedef char для int.
Один "ужас кодирования" упомянул, что заголовок одной компании имел точку, в которой программист хотел иметь логическое значение, а char был логическим родным типом для задания, и поэтому написал typedef bool char
. Затем позже кто-то нашел целое число наиболее логичным выбором и написал typedef bool int
. Результат, возраст до Unicode, был практически typedef char int
.
Довольно много перспективной, передовой совместимости, я думаю.