次の質問があります。現在のC1Xドラフトに従って匿名構造(またはユニオン)を適切に初期化するにはどうすればよいですか?これは合法ですか:
struct foo {
int a;
struct {
int i;
int j;
};
int b;
};
struct foo f = { 1, 2, 3, 4 };
struct foo g = { 1, { 2 }, 3 };
GCCで、g.j == 0
およびg.b == 3
、tccg.j == 3
およびでg.b == 0
。現在のドラフトは次のように述べています。
「[...]構造体および共用体型のオブジェクトの名前のないメンバーは初期化に参加しません。構造体オブジェクトの名前のないメンバーは、初期化後も値が不確定です。」
これは本当に本当ですか?そうじゃない
struct foo h = { 0 };
すべてのメンバーを0に設定することになっていますか?
どうもありがとう!
更新:
匿名メンバーは構造体/共用体を混合する場合にのみ役立つように思われるため、これを正しく初期化する方法は次のとおりです。
struct bar {
int tag;
union {
double d;
int i;
};
};
?これにより、gcc<4.6およびicc11でエラーが発生しますが、gcc 4.6、icc 12、clang、およびtccで機能します。
struct bar a = { .tag = 1, .i = 42 };
これにより、clangとtccでエラーが発生しますが、gccとiccでは機能します。
struct bar b = { .tag = 1, { .i = 42 } };
2つ目は基準違反ですか?