2015-04-03 2 views
0

Как определить struct с союз внутри, так что он занимает всего 1 байт? Я пытался добавить __attribute__((packed)) всюду, но это не помогло.Форсирование выравнивания соединения внутри структуры

Вот члены структуры:

struct 
{ 
    int blockNumber: 1 __attribute__((packed)); 
    int shallBe1: 1 __attribute__((packed)); // should be set to 1 per ISO 14443-4 
    int nadFollowing: 1 __attribute__((packed)); // always 0 in our software 
    int cidFollowing: 1 __attribute__((packed)); // always 0 in our software 
    union 
    { 
     int chaining: 2 __attribute__((packed)); // i-block 
     int ackNak: 2 __attribute__((packed)); // r-block 
     int deselectOrWtx: 2 __attribute__((packed)); // s-block 
    } __attribute__((packed)); 
    int blockType: 2 __attribute__((packed)); 
} pcb __attribute__((packed)); 

SizeOf (печатной платы) возвращает более чем на 1, в то время как мне это нужно занимать ровно один байт.

Вот как я проверить размер структуры:

BYTE testpcb[sizeof(pcb) == 1 ? 0 : -1]; 

Если я получаю сообщение об ошибке во время сборки, то структура не 1 байт.

+0

попробуйте сделать базовый тип битовых полей 'uint8_t' вместо (или' unsigned char', если он недоступен). –

+0

Не повезло, размер все еще не 1 байт. –

+0

Каждый 'int' - это два байта, и у вас есть пять из них в' struct' даже без 'union'. Я не вижу, как вы можете ожидать, что все это будет всего лишь одним байтом. –

ответ

1

Каждый компилятор обрабатывает битполы по-разному, и не все компиляторы имеют четко определенные методы контроля того, как битполы будут упакованы. При использовании битполей получение смещений структуры для упаковки, как вы хотите, может быть затруднено, а иногда просто невозможно.

Если бы я был вами, я бы относился к нему как к u8 и маски при необходимости. Это не идеально, но по моему опыту, что вы будете использовать здесь.

Смежные вопросы