Код
typedef union
{
int asHeader;
struct
{
int header;
int int1;
int int2;
int int3;
}asInt3;
struct
{
int header;
char array[30];
}asArray;
}my_union;
const int asInt3_size = sizeof(my_union.asInt3); // error: expected a ")" т.е. предлагает мне сделать sizeof(my_union);
{
int asHeader;
struct
{
int header;
int int1;
int int2;
int int3;
}asInt3;
struct
{
int header;
char array[30];
}asArray;
}my_union;
const int asInt3_size = sizeof(my_union.asInt3); // error: expected a ")" т.е. предлагает мне сделать sizeof(my_union);
А я бы очень хотел получить размеры каждого члена(или как там правильно его назвать) юниона.
Задумка такая: одной переменной описать три разных типа пакета, отличающиеся длиной и типом поля data.
Однако первые n байт всех трёх типов пакетов одинаковы и соответствуют заголовку(header).
Отправлять планируется в зависимости от надобности либо sizeof(my_union.asHeader); либо sizeof(my_union.asInt3) либо sizeof(my_union.asArray); байтов.
Header содержит поле, описывающее тип пакета, соответственно принемающая сторона всегда будет знать как трактовать пришедший пакет, сначала проанализировав это поле по my_union.asHeader;
К тому-же иногда(для подтверждения доставки) достаточно отправить просто asHeader.
Привлекательность состоит в том, что весь union займет в памяти столько месте, сколько необходимо для самого жирного члена(sizeof(asArray)) а AsHeader будет равен asArray.header и asInt3.header - потому как по идее &my_union_var.asHeader == &my_union_var.asInt3.header == &my_union_var.asArray.header
Верно ли последнее предположение по поводу header и как взять sizeof от члена union?
Или же поступить проще и определить структуры asHeader, asInt3, asArray отдельными typedef'ами, а union просто будет:
Код
typedef union
{
asHeader_type asHeader;
asInt3_type asInt3;
asArray_type asArray;
}my_union;
const int asInt3_size = sizeof(asInt3_type);
{
asHeader_type asHeader;
asInt3_type asInt3;
asArray_type asArray;
}my_union;
const int asInt3_size = sizeof(asInt3_type);
P.S. Ссылочку на стандарт С99 мне подкинули, но оказалось что сходу там ответ найти бывает очень сложно.
