2013-09-05 3 views
1

я часто использую такой код:НКУ __packed__ не работает, как ожидалось

struct teststruct 
{ 
    uint8_t i1; 
    uint16_t i2; 
    uint32_t i4; 
} __attribute__((__packed__)); 
struct teststruct *protocol = (struct teststruct *)buffer; 
uint16_t var = protocol->i2; 

Чтобы получить доступ к данным протокола с помощью структур.

Код работает для AVR gcc 4.6, 4.7 и Win32 4.6, 4.7 и Linux 4.6 Однако теперь из (MingW) gcc 4.8 он работает не так, как ожидалось. sizeof (struct teststruct) вернется 8.

Я не нашел никаких подсказок, почему он больше не работает. Или есть другой способ получить доступ к буферу протокола структурным способом?

ответ

1

Похоже, что сборник с -mno-ms-bitfields должен помочь (см. Расширенное обсуждение on the GCC bugzilla). У меня нет MinGW на руках, но я создал простое воспроизводство:

#include <stdint.h> 
#include <stdio.h> 

struct teststruct 
{ 
    uint8_t i1; 
    uint16_t i2; 
    uint32_t i4; 
} __attribute__((__packed__)); 

int main(void) 
{ 
    fprintf(stderr, "size = %d\n", sizeof(struct teststruct)); 
    return 0; 
} 

И скомпилирован на Linux с -mms-bitfields, поэтому она возвращает 8. По умолчанию 7. Я полагаю, -mms-bitfields по умолчанию для окон целей.