1 packed structure 만드는 방법 #
#pragma pack(1)와 같은 지시어는 gcc 4부터 가능하다. 하지만 구버전 GNU C 컴파일러를 사용하고 있다면 (대부분의 경우 임베디드 프로그래밍 중일 경우가 되겠다) 다음 두 가지중 한가지 방법을 사용하여 구조체가 pack처리되어있다는 것을 보장해줄 수 있다.
- 구조체가 본래 pack 되어있도록 잘 정의한다. 이 방법은 컴파일러가 타겟 기계에 바이트 정렬을 어떻게 하는지를 알고 있어야하므로 코딩하기도 어렵고 관리하기도 까다롭다.
- 구조체의 맴버마다 "packed" 속성을 적용한다. 이 속성 기능은 GNU C 컴파일러의 확장기능이다. 예를 들면 아래와 같이 사용할 수 있다.
struct test { unsigned char field1 __attribute__((__packed__)); unsigned short field2 __attribute__((__packed__)); unsigned long field3 __attribute__((__packed__)); } var1, var2;
(각 맴버 변수 선언마다 세미콜론으로 끝나기 전) "attribute" 키워드를 "packed"속성과 함께 사용할 때 소괄호를 두번쓰는것에 주의하라. 의 사용에 주의하라.
위와 같지만 또다른 선택가능한 방법은 아래와 같다.
struct test { unsigned char field1; unsigned short field2; unsigned long field3; } __attribute__((__packed__)); typedef struct test test_t; test_t var1, var2;
이것은 구조체의 모든 맴버들이 pack 처리되어 있다는 것을 지정한다. 이 구문은 typedef와 struct 선언을 조합하여 사용하려하거나 구조체 정의와 변수 선언을 조합하여 사용하려 할 경우에는 잘 동작하지 않는 문법으로 보일 수 있다는 것에 주의하라. (즉, 위 처럼 나눠쓰는것이 보기에 좋다.)
- gcc 2.95.2에서는 아예 컴파일러 툴체인을 리빌드해서 해결할 수 있다. gcc-2.95.2/gcc/config/i386/linux.h 파일에
#define HANDLE_PRAGMA_PACK_PUSH_POP 1
이것을 추가하고 컴파일러를 다시 빌드하면 #pragma pack(push,<n>)와 #pragma pack(push)를 사용하여 구조체 필드의 최대 정렬 바이트를 변경할 수 있다.









![[http]](/wiki/imgs/http.png)
