C11 標準では、単一のユニオン内にネストされた構造体によって共有される共通の初期シーケンスの次の定義があります。
6.5.2.3/6
共用体の使用を簡素化するために、1 つの特別な保証が行われます。共用体に、共通の初期シーケンス (以下を参照) を共有する複数の構造体が含まれている場合、および共用体オブジェクトに現在これらの構造体の 1 つが含まれている場合、共通の構造体を検査することが許可されます。それらのいずれかの最初の部分は、共用体の完全な型の宣言が表示される場所であればどこでも使用できます。対応するメンバーが 1 つ以上の初期メンバーのシーケンスに対して互換性のある型 (およびビット フィールドの場合は同じ幅) を持っている場合、2 つの構造体は共通の初期シーケンスを共有します。
例 3 以下は有効なフラグメントです。
union { struct { int alltypes; } n; struct { int type; int intnode; } ni; struct { int type; double doublenode; } nf; } u; u.nf.type = 1; u.nf.doublenode = 3.14; /* ... */ if (u.n.alltypes == 1) if (sin(u.nf.doublenode) == 0.0) /* ... */
ただし、この記事の理解によると、上記のコードは無効です。
In the outer if
statement we indicate that n::alltypes
data member is active (simultaneously with ni::type
and nf::type
as the standard states) yet in the inner if
we use nf::doublenode
which is not a part of the common initial sequence.
Can somebody clarify this issue?