2013-09-05 9 views
1

내가 자주 같은 코드를 사용하여 예상대로 작동하지 않습니다GCC __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; 
} 

을 그리고 -mms-bitfields와 리눅스에 컴파일, 그래서, 8 기본 내가 생각 7.이다 반환 -mms-bitfields는 Windows 대상에 대한 기본값입니다.