У меня есть необходимость хранить значение цвета в формате 0xAARRGGBB, то есть, нужен тип, занимающий 4 байта. Я использую unsigned int, но, насколько знаю, на 32-разрядном процессоре, uint, в зависимости от компилятора, может весить 2 байта. Возникает вопрос, как бы объявить тип ARGB, чтобы он занимал 4 байта, через typedef? Можно ли как-нибудь, например, через условную компиляцию, сделать typedef от unsigned, если sizeof(unsigned) == 4 и от unsigned long иначе? Я не хочу создавать класс, содержащий 4 char'а, мне нужно, чтобы он был числовым, в т.ч. чтобы работал вариант
ARGB color = 0xff000000;
На данный момент у меня просто typedef unsigned int ARGB;
P.S.
Qt использует такой же
typedef unsigned int QRgb;
Однако, как я понимаю, qmake использует компилятор, в котором int всегда весит 4 байта
Смотрим в сstdint и выбираем тип uint32_t...
Если очень хочется выкрутиться через sizeof, то можно поиграться в шаблонные игры типа
template<size_t N>
struct uint
{
using type =
conditional_t<sizeof(unsigned char) == N, unsigned char,
conditional_t<sizeof(unsigned short int) == N, unsigned short int,
conditional_t<sizeof(unsigned int) == N, unsigned int,
conditional_t<sizeof(unsigned long) == N, unsigned long,
conditional_t<sizeof(unsigned long long) == N, unsigned long long,
void>>>>>;
static_assert(!is_same_v<type,void>,"Error - type not exist");
};
using u4int = uint<4>::type;
Стандартная библиотеки языков С и С++ не гарантируют наличия типов конкретного размера, т.е. наличия типов вроде std::uint32_t не гарантируется - это опциональные типы. Если вы хотите портабельности/платформеннонезависимости вашего кода на уровне языка, то либо используйте тип минимально достаточного размера, вроде std::uint_least32_t, либо конструируйте некий свой агрегатный тип самостоятельно. Если вам нужна бинарная междуплатформенная портабельность, то остается лишь последний вариант.
Если Вы действительно не знаете для какой системы и каким компилятором будет транслироваться программа то стоит учесть, что есть системы как little-endian так и big-endian. Именно поэтому стоит использовать четыре байта. А если быть точнее то именно четыре uint8_t. Таким образом порядок байт и их разрядность будет соблюдена. Для удобства можно создать класс, который будет приводить данную структуру к unsigned int путем побитового сдвига, что также будет гарантировать правильное расположение значений цвета во всех системах.
Я не хочу создавать класс, содержащий 4 char'а, мне нужно, чтобы он был числовым, в т.ч. чтобы работал вариант
ARGB color = 0xff000000;
Если уж Вы работаете в С++, то как раз нужно создать класс, содержащий 4 char'а. А потом перегрузить присваивание константой для этого класса, чтобы работало ARGB color = 0xff000000;
Это и будет С++-way. :-)
Сборка персонального компьютера от Artline: умный выбор для современных пользователей