2012-04-26 84 views

答えて

1

あなたの構造を脇に宣言する必要があります。

+0

あなたはBとCを別々に宣言し、Aの中に 'typedef struct _A {union {struct B b;構造体C c;} u; } A; ' – Nitrate

+0

うん。次に、このタイプを使用できます。 – md5

+0

@Nitrateしかし、スタンドアロンの 'B'を宣言すると、それは自動的に囲む' A'の一部ではないことに注意してください。 – Alnitak

4

typedefが唯一の労働組合や構造は、その中に定義されていない、Aをカバーして動作しません。

typedefのようにネストすることはできません。各ユーザ定義の「型」には1つのラベルが必要です。したがって、タイプがA.u.Bの変数の宣言は不正です。

3

これはそれを行う必要があります。

/* Initialise to zero */ 
A a = {{{0},{0}}}; 
/* Now set the b to 5 */ 
a.u.B.b = 5; 

あなたは慎重に波括弧を見れば、あなたは彼らが正確に型宣言にブラケットを一致していることがわかります。したがって、最初のブレースはAで始まり、第2はA.uで始まり、第3はA.u.Bで始まり、最初の0A.u.B.bに対応します。閉じ括弧がA.u.Bで終了すると、カンマは次の開きブレースがA.u.Cで始まるので、2番目のゼロはA.u.C.cに初期化され、すべてのブレースが再び閉じられます。

メモ匿名の構造体は、すべてのコンパイラでサポートされているわけではありません。私は彼らが標準によって許可されているかどうか覚えていない...

+0

私は「A.u.B b = 5」として初期化できません。 – Nitrate

+0

@Nitrate no、(私の答えによれば) 'A.u.B'のような型はないからです。 'A'型の変数を宣言し、その内容を設定する必要があります。 – Alnitak

+0

@Alnitakは正しいです、本当に 'A.u.B'ではありません。私はちょうどカッコが初期化する方法を説明するためにその表記法を使用しました。 – Ben