2010-02-17 60 views
1

我已经制作了一个可以在LISP中使用的整数和指针等结构。如何初始化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 2010-02-17 11:22:19

回答

2

这是一个known bug

...已在gcc 4.6中修复(使用struct Atom anInt={{ .tag=1, {.val=0} }};)。

+0

谢谢。我不认为编译器可能有错。 – philcolbourn 2010-02-17 12:16:04