В принципе, у вас могут возникнуть проблемы с отступами / выравниванием, но, учитывая типы в том порядке, в котором вы их использовали, это маловероятно. У вас больше шансов получить проблемы с различным порядком байтов на разных платформах.
Кроме того, написанный вами код нарушает строгие правила псевдонимов C ++. Хотя ваш тип UUID
содержит только массивы символов, он равен , а не массиву символов. Поэтому нельзя полностью исключить возможность возникновения проблем с оптимизатором (в форме неверно написанного кода).
Если вам не нужно, чтобы ваш класс UUID
был POD, самым простым решением был бы конструктор для UUID, подобный этому:
struct UUID {
unsigned char data1[4];
unsigned char data2[2];
unsigned char data3[2];
unsigned char data4[8];
UUID(uint32_t d1, uint16_t d2, uint16_t d3, uint64_t d4)
{
data1[0] = d4 & 0xff;
data1[1] = (d4 >> 8) & 0xff;
data1[2] = (d4 >> 16) & 0xff;
data1[3] = d4 >> 24;
// etc.
}
};
Тогда вы можете определить свой объект UUID как
UUID uuid(0x80DFDD28, 0xF033, 0xB027, 0xCDD2078FC78A);
Если ваш объект UUID должен быть POD, вы можете сделать это следующим образом:
struct UUID {
unsigned char data1[4];
unsigned char data2[2];
unsigned char data3[2];
unsigned char data4[8];
};
struct UUIDAssign: UUID
{
UUIDAssign(uint32_t d1, uint16_t d2, uint16_t d3, uint64_t d4)
{
data1[0] = d4 & 0xff;
data1[1] = (d4 >> 8) & 0xff;
data1[2] = (d4 >> 16) & 0xff;
data1[3] = d4 >> 24;
// etc.
}
};
и инициализировать так:
UUID uuid = UUIDAssign(0x80DFDD28, 0xF033, 0xB027, 0xCDD2078FC78A);