arm-linux-gcc 나 arm-linux-g++에서 packed에 의한 버그인지좀 봐주세요...

레모네이드의 이미지

#include <stdio.h>
 
#ifdef _WIN32
#define _packed __attribute__((__packed__))
#else
#define _packed
#endif
 
struct  normal_t {
    int          v;
};
 
#pragma pack(1)
struct _packed packed_t {
    short        v;
    normal_t     n;
};
#pragma pack()
 
int main() {
      normal_t n = {1000};
      packed_t pk;
      pk.v = 2000;
      printf("%d\n",pk.v);
      pk.n = n;
      printf("%d\n",pk.v);
      return 0;
}

arm-linux-g++로 컴파일하여 실행한 결과는
2000
1000

vc 및 g++로 컴파일하여 실행한 결과는

2000
2000

union도 아니고...왜 이리 되는지....
packed struct 가 문제를 일으키는거 같습니다..
위의 코드를 vc나 g++ gcc로 컴파일하는겨우에는 문제가 없으나
arm-lunux-gcc나 arm-linux-g++로 컴파일하는 경우에는 문제가 발생하네요...
지금 막연하게 컴파일러 버그인가 추정하고 있습니다..

통신용 코드를 작성하는데 이 문제를 해결해야 해서 골치가 아프네요...
디버깅하다가 스레드부터 뒤지기 시작해서 온 코드 다 뒤지다가 24시간동안 디버깅해서 간신히 찾은 버그가...
위와 같은 코드에서 벌어지는 현상이라니 ....... ㅠㅠ....

레모네이드의 이미지

#include 
 
#ifdef _WIN32
#define _packed __attribute__((__packed__))
#else
#define _packed
#endif
 
struct  normal_t {
    int          v;
};
 
#pragma pack(1)
struct _packed packed_t {
    short        v;
    normal_t     n;
};
#pragma pack()
 
int main() {
      normal_t n = {1000};
      packed_t pk;
      pk.v = 2000;
      printf("%d\n",pk.v);
      pk.n.v = n.v;
      printf("%d\n",pk.v);
      return 0;
}

이런 방법으로는 가능한데.... normal_t 구조체에 맴버 데이터가 여러개 인경우에는 각각 전부 따로 할당해야하는 번거로움이 생기네요..
근데 아무리 생각해도 arm-linux-g++가 버그같은데...
우....win,win.ce,lunux,arm-lunux, 다 돌아가게 만드는 코드로 작성하는것은 넘 힘든 작업임에 틀림 없습니다...

이렇게 않하고 할수 있는 방법이 있으면 공유좀 바랍니다....