Учитывая постоянную структуру в одном API, который должен быть истолкован как 16 последовательных байты uint8_t в других API, есть способ, в C, чтобы сделать это преобразование во время компиляции:Преобразования между константными типами структуры во время компиляции
Что я хотел бы достичь, это что-то вроде
const union {
struct a {
uint32_t a;
uint16_t b;
uint16_t c;
uint8_t d[8];
} a;
uint8_t b[16];
} foo = { .a = { 0x12341243, 0x9898, 0x4554,
{ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 } } };
struct from_other_api manifest = {
.appuuid = foo.b;
// { foo.b[0], foo.b[1], ... }
};
Такой подход, а также второй вариант в комментировал линии, к сожалению, дают как ошибка ошибка: инициализатор элемент не является постоянной, хотя это, безусловно, выглядит как постоянная ,
Деловая причина заключается в том, что оба определения struct from_other_api manifest
и постоянная память blob имеют API, который нельзя изменять. Преобразование может быть сделано вручную, как
struct from_other_api manifest = {
.appuuid = { 0x43, 0x12, 0x34, 0x12, 0x98, 0x98, 0x54, 0x45,
0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 }
};
, но следует избегать, так как это шаблон регулярного орать быть автоматизирован.
Вы используете 'C99' или выше? –
Я использую gcc без указания '-std = c99'; даже если это может выглядеть так, это может быть расширение gnu ... –