История изменений
Исправление kawaii_neko, (текущая версия) :
хочу найти тулзу которая может сгенерировать структуру и пребразование структур из packed(8) в упакованую по 1 и обратно..
Зачем? На современных процессорах выравнивание не играет практически никакой роли. За подтверждением — в интеловские мануалы.
То, что ты хочешь, тривиально решается препроцессором, но твоей любимой IDE может снести крышу к чертям от такого. Сильно на любителя.
/* МАГИЯ */
#define DEFFIELD(TYPE, NAME) TYPE NAME;
#define CPYFIELD(TYPE, NAME) dst->NAME = src->NAME;
#define DEFSTRUCT(NAME) struct Name { NAME##_FIELDS(DEFFIELD) };
#define DEFPSTRUCT(NAME) struct Name##Packed { NAME##_FIELDS(DEFFIELD) };
#define DEFPACK(NAME) void Pack##NAME(const struct NAME *src, struct NAME##Packed *dst) { NAME##_FIELDS(CONV) }
#define DEFUNPACK(NAME) void Unpack##NAME(const struct NAME##Packed *src, struct NAME *dst) { NAME##_FIELDS(CONV) }
/* декларирование полей всех структур */
#define Foo_FIELDS(XX) XX(char, uno) XX(int, dos)
#define Bar_FIELDS(XX) XX(char, one) XX(float, two)
/* перечисление всех структур */
#define STRUCTS(XX) XX(Foo) XX(Bar)
/* генерируем обычные структуры*/
#pragma pack(8,push)
STRUCTS(DEFSTRUCT)
#pragma pack(pop)
/* генерируем запакованные структуры*/
#pragma pack(1,push)
STRUCTS(DEFPSTRUCT)
#pragma pack(pop)
/* Генерируем методы упаковки */
STRUCTS(DEFPACK)
/* методы распаковки */
STRUCTS(DEFUNPACK)
Исходная версия kawaii_neko, :
хочу найти тулзу которая может сгенерировать структуру и пребразование структур из packed(8) в упакованую по 1 и обратно..
Зачем? На современных процессорах выравнивание не играет практически никакой роли. За подтверждением — в интеловские мануалы.
То, что ты хочешь, тривиально решается препроцессором, но твоей любимой IDE может снести крышу к чертям от такого. Сильно на любителя.
/* МАГИЯ */
#define DEFFIELD(TYPE, NAME) TYPE NAME;
#define CPYFIELD(TYPE, NAME) dst->NAME = src->NAME;
#define DEFSTRUCT(NAME) struct Name { NAME##_FIELDS(DEFFIELD) };
#define DEFPSTRUCT(NAME) struct Name##Packed { NAME##_FIELDS(DEFFIELD) };
#define DEFPACK(NAME) void Pack##NAME(const struct NAME *src, struct NAME##Packed *dst) { NAME##_FIELDS(CONV) }
#define DEFUNPACK(NAME) void Unpack##NAME(const struct NAME##Packed *src, struct NAME *dst) { NAME##_FIELDS(CONV) }
/* декларирование полей всех структур */
#define Foo_FIELDS(XX) XX(char, uno) XX(int, dos)
#define Bar_FIELDS(XX) XX(char, one) XX(float, two)
/* перечисление всех структур */
#define STRUCTS(XX) XX(Foo) XX(Bar)
/* генерируем обычные структуры*/
#pragma pack(8,push)
STRUCTS(DEFSTRUCT)
#pragma pack(pop)
/* генерируем запакованные структуры*/
#pragma pack(1,push)
STRUCTS(DEFSTRUCT)
#pragma pack(pop)
/* Генерируем методы упаковки */
STRUCTS(DEFPACK)
/* методы распаковки */
STRUCTS(DEFUNPACK)