U E D R S I H C RSS
ID
Password
Join
사람들은 당신의 말을 의심할지 모르나 당신의 행동은 믿을 것이다. ―L.C.



Contents

1 packed structure 만드는 방법

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)를 사용하여 구조체 필드의 최대 정렬 바이트를 변경할 수 있다.

Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2010-10-28 12:42:52
Processing time 0.4500 sec