Компилятор переменного тока в конечном итоге должен компилироваться в машинный код. Машинный код имеет только жесткие типы с фиксированной шириной, такие как 32-разрядное целое, 64-разрядное целое и т. Д. (Или, скорее, он имеет блоки памяти такого размера + операции, которые работают с памятью такого размера и обрабатывают его как подписанный илиunsigned)
Так что люди, которые создают ваш компилятор, определяют, что на самом деле использует ваш компилятор, когда вы запрашиваете у него int
, а заголовочный файл stdint.h
- это файл, который они пишут,Это в основном документация того, что они сделали. Они знают, что, например, их тип long
имеет размер 64 бита, поэтому добавьте typedef long int64_t;
и т. Д.
В системе, где int
составляет 16 бит, а long
составляет 32 бита, они могут дажепусть их компилятор поймет специальный внутренний тип и, например, назовет его __int64
, а затем заставит stdint.h
содержать typedef __int64 int64_t;
.
Стандарт C просто определяет, что должен быть заголовок stdint.h
, предоставленныйваш компилятор, и что если вы определите int64_t
там, он должен сопоставиться с типом данных, который имеет правильный размер.
Теоретически можно просто встроить все в stdint.h
вместо этого в компилятор (поэтому вместо использования промежуточного имени, такого как __int64
и определения его типа в int64_t
, они могут просто использовать int64_t
напрямую, но при использовании этого подхода существовал старый код, который был написан до stdint.h
, иОпределенный их собственный тип с именем int64_t
может просто не включать stdint и, таким образом, будет продолжать компиляцию. Имена, начинающиеся с двух подчеркиваний, исторически были зарезервированы для производителя компилятора, поэтому шансов на существование не существует. код Ting C, используя имя __int64
уже.