В компиляторе MSVC++ можно использовать __int8, __int16, __int32 и аналогичные типы для целых чисел с определенными размерами. Это чрезвычайно полезно для приложений, которым необходимо работать с низкоуровневыми структурами данных, такими как пользовательские форматы файлов, структуры данных управления оборудованием и т.п.
Есть ли аналогичный эквивалент, который я могу использовать в компиляторе GCC?





Стандарт ISO C, начиная со стандарта C99, добавляет стандартный заголовок <stdint.h>, который определяет следующее:
uint8_t - unsigned 8 bit
int8_t - signed 8 bit
uint16_t - unsigned 16 bit
int16_t - signed 16 bit
uint32_t - unsigned 32 bit
int32_t - signed 32 bit
uint64_t - unsigned 64 bit
int64_t - signed 64 bit
Я использую эти типы постоянно.
Эти типы определены только в том случае, если реализация поддерживает предопределенные типы с соответствующими размерами и характеристиками (что большинство из них поддерживает).
<stdint.h> также определяет типы с именами в форме (u)int_leastN_t (типы, которые имеют по меньшей мере указанной ширины) и (u)int_fastN_t («самые быстрые» типы, которые имеют по крайней мере указанную ширину); эти типы являются обязательными.
Если вы используете старую реализацию, которая не поддерживает <stdint.h>, вы можете использовать свою собственную; одна реализация - "Q8" Дуга Гвина.
Понятно. Я смутно помню, что видел атрибут компилятора, который делает что-то подобное ...
Я помню, как много лет назад у меня была эта проблема наоборот (не uint8_t в Microsoft) :)
@Pramod: он существует, но вы не хотите его использовать. Это __attribute __ ((режим (...)))
Они требуются в ISO только в том случае, если в реализации есть типы, которые их поддерживают (я знаю, что это должно быть в большинстве реализаций). Также существуют варианты atleast для типов такого размера или больше.
@paxdiablo: очень хороший аргумент, но, честно говоря, если вы компилируете для архитектур, которые не поддерживают подписанные и неподписанные варианты с указанной выше шириной, вы наверняка задаете этот вопрос нет;)
stdint.h также является частью C99, поэтому он больше не зависит от posix.