Имам следния съюз и той работи правилно:
#pragma pack(1)
...
union
{
uint8_t opcode;
struct
{
uint8_t z : 3;
uint8_t y : 3;
uint8_t x : 2;
};
}opcode;
Размерът на обединението е точно един байт, според
printf ("%zu\n", sizeof opcode);
Проблемът възниква, когато се опитам да направя обединение от битовото поле там:
union
{
uint8_t opcode;
struct
{
uint8_t z : 3;
union
{
uint8_t y : 3;
struct
{
uint8_t p : 2;
uint8_t q : 1;
};
}y;
uint8_t x : 2;
};
}opcode;
Резултатът от
printf ("%zu\n", sizeof opcode);
е 3 байта. Разбира се, мога да заобиколя това с макроси, но възможно ли е изобщо?