2010-02-17 5 views
1

LISP에서 사용할 수있는 int 및 포인터 등의 구조체를 만들었습니다.C에서 익명 구조의 두 번째 멤버를 초기화하는 방법은 무엇입니까?

포인터가 8 바이트 단위로 정렬되어 있으므로 tag = 0입니다. 정수는 29 비트이고 태그는 1입니다. 다른 유형은 다른 태그 값을 갖습니다.

struct Atom{ 
    union{ 
    Pair    *pair; 
    struct{ 
     unsigned  tag  :3; 
     union{ 
     int   val  :29; 
     char   ch; 
     struct{ 
      int   mant :21; 
      Exp   exp  :8; 
     }; 
     }; 
    }; 
    }; 
}; 

나는 그들을 다르게 초기화하고 싶습니다. 포인터를 들어

: 내가 생각하기 때문 작동

Atom aPair = {{.pair=0}}; // works 

또는

Atom aPair = {{0}}; //works 

는 GCC 내가 노동 조합의 첫 번째 멤버를 초기화 할 것으로 가정합니다.

나는 또한 정수를 초기화하고 싶습니다

-이 같은 :

Atom anInt={{ {.tag=1,{.val=0} } }}; 

난이없는 표준 C 알지만, GCC에서 익명 구조체와 전혀이 가능합니까?

+0

내가 대답 한 답변이있었습니다. 어디로 갔습니까? 누군가가 Atom을 사용하도록 제안했습니다. anInt = {. tag = 1, .val = 0}; 그것은 작동하지 않았지만 시도하지 않은 것이 었습니다. 그리고 제 질문을 읽고 뭔가 제안 할 시간이 걸렸습니다. – philcolbourn

답변

2

known bug입니다.

... gcc 4.6에서 수정되었습니다 (struct Atom anInt={{ .tag=1, {.val=0} }}; 사용).

+0

고맙습니다. 나는 컴파일러가 잘못되었다고 생각하지 않았다. – philcolbourn