Program/C,C++,MFC

기본 구조체 사이즈 변경. #pragma pack 사용

훈이아제 2012. 3. 30. 11:09

C, C++ 에서 구조체의 저장크기가 변하는 경우가 있다.
이는 기본 구조체의 싸이즈가 정해져 있기 때문이다.
윈도우에서는 프로그램 속성에서 기본구조체를 원하는 형태로 바꾸면 된다. 그러나 그럴경우 어떠한 문제가 생길지는 기존에 사용하는 프로그램과 호환시 문제가 발생할 수 있다.( 기존프로그램에서는 변경되지 않고 사용했을 경우 서로 주고받는 Data 의 구조가 달라져서 문제가 생긴다.)
이 때, 기본 구조체의 싸이즈는 그대로 두고 현재 부분의 구조체만 변경시에는 #pragma pack 을 사용한다.

struct __TEMP_DATA_S
{
    short aaa;
    int   bbb;
}
위의 구조체를 sizeof 하여 값을 보면 8로 나온다.
우리가 생각할때는 6으로 나와야되나 기본 구조체 사이즈가 4바이트 형식이므로 맞추어 떨어지게 하기위하여 2바이트를 더하여 8바이트로 변경된다.

#pragma pack(puch, 2)   // 기본구조체사이즈를 2바이트형으로 변경한다.
struct __TEMP_DATA_S
{
    short aaa;
    int   bbb;
}
#pragma pack(pop)        // 기본구조체 사이즈를 2바이트형에서 원래의 기본 바이트로 변경한다.
으로 #pragma pack 을 추가하면 sizeof 시 값이 우리가 원하는 6으로 나온다.

참고 ----1
#pragma pack(puch, 1)   // 기본구조체사이즈를 1바이트형으로 변경한다.
struct __TEMP_DATA_S
{
    short aaa;
    char  ccc;
    int   bbb;
}
#pragma pack(pop)        // 기본구조체 사이즈를 1바이트형에서 원래의 기본 바이트로 변경한다.
----1

제 경험상으로는 PLC와 PC 와의 통신 프로그램 생성시 PC는 4바이트가 기본형이지만 PLC측은 WORD(2바이트)가 기본형이어서 문제가 많이 발생하여 그 때, 주로 사용하였습니다.

pack의 puch는 뒤의 사이즈로 변경한다는 의미.
pack의 pop은 바꾸기전의 사이즈로 변경한다는 의미.

* (VC,VC++) 와 (GCC, G++) 간에는 약간의 사용상 차이가 있을 수 있다.