2014-08-29 2 views
3

코드 외부에 C 구조체가 정의되어 있습니다. 같은 구조의 팩 된 버전을 정의 할 수 있습니까? 내가 처음부터 내 자신의 구조를 정의하는 경우, 그것은 간단하다 C 구조체의 팩 버전 정의

struct test { 
    // members 
} __attribute__((packed)); 

나는 단순한 구조를 정의하고 두 가지 가능성이 시도 :

struct test { 
    int x; 
    double y; 
    char z; 
}; 

struct test_p { 
    struct test __attribute__((packed)) s; 
}; 

이 :

struct test { 
    int x; 
    double y; 
    char z; 
}; 

struct test_p { 
    struct test p; 
} __attribute__((packed)); 

을 그러나, sizeof (struct test)와 같은 sizeof (struct test_p) = 24를 내 시스템에서 인쇄합니다 (64 비트 머신에서는 gcc 4.8.2를 사용합니다). 원하는 효과를 얻을 수있는 방법이 있습니까?

단지 궁금한 점이 있습니다. 네트워크를 통해받은 패킷을 구문 분석하고 싶습니다. 단지 포장 된 구조입니다. 것은 그것이 타사 라이브러리의 일부이기 때문에 헤더 파일을 수정할 수 없으며 구조체 자체에 하나씩 복사하기에 너무 많은 필드가 포함되어 있기 때문입니다. 확실히 구조 정의를 내 머리글에 복사하고 압축 된 버전을 만들 수 있습니다. 실제로는 지금 사용하고있는 솔루션입니다. 그러나 전체 정의를 복사하지 않는보다 간결한 솔루션이 있는지 궁금합니다. .

+0

재미있는 질문이지만 우아한 해결책을 찾지 못할 것이라고 생각합니다. "이 속성은 열거 형, 구조체 또는 공용체를 정의하지 않는 typedef가 아니라 enum, struct 또는 union의 정의에만 지정할 수 있습니다." https://gcc.gnu.org/onlinedocs/gcc/Type-Attributes.html – Dave

답변

1

gcc는 에 정확하게 __attribute__((packed))을 소개했습니다. 위험한 효과를 피하십시오. 동일한 정의를 사용하는 모든 사용자 응용 프로그램과 라이브러리간에 구조의 정의가 이진 호환되어야합니다.

그러나 gcc는 또한 포장을 수행하는 방법을 제공합니다. the old fashioned, dangerous way - #pragma pack(push,n)#pragma pack(pop). 타사 헤더 파일에 구조체 정의 만 포함되어 있거나 헤더에서 다른 것을 사용하지 않는 경우에만 안정적으로 작동합니다. 그런 그들을 사용

#pragma pack(push,1) 
#include "theheader.h" 
#pragma pack(pop) 

그렇지 않으면, 나는 개인적으로 단순히 구조 정의를 복사하여 붙여 넣은 것, 이름을 변경하고, 내 자신의 헤더에 __attribute__((packed))을 추가했다. pragma로 패킹하는 것은 정말 더러운 해킹입니다. 타사 헤더가 예상치 못한 방식으로 변경되어 the bit rot에 기여할 수 있습니다.