問題タブ [anonymous-struct]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
598 参照

c - C11 - 構造体へのポインターを構造体の匿名の最初のメンバーに変換する

C 標準には次のように記載されています。

適切にキャストされた構造体オブジェクトへのポインターは、その最初のメンバー (または、そのメンバーがビットフィールドの場合は、それが存在するユニット) を指し、その逆も同様です。

問題の構造体の最初のメンバーが匿名の構造体/共用体である場合、C11でそのような「適切なキャスト」を実行する可能な(そして明確に定義された)方法はありますか? または、含まれている構造体が匿名の場合、「その逆」の後方キャストを実行するには?

匿名構造体と同じメンバーシーケンスを持つ非匿名構造体にキャストすると、互換性がないため、これが明確に定義されなくなり、同じメモリレイアウトを持つことが保証されないと思います。

ただし、C 標準には次のように記載されています。

さらに、別々の翻訳単位で宣言された 2 つの構造体、共用体、または列挙型は、それらのタグとメンバーが次の要件を満たしている場合に互換性があります。両方がそれぞれの翻訳単位内のどこかで完了している場合、次の追加要件が適用されます: メンバー間に 1 対 1 の通信が存在するものとします <...>

このルールを無名構造体に適用することはできますか? 次の設定があるとします。

header.h:

9月c:

main.c:

(これはgcc (GCC) 4.8.3 20140911でコンパイルされ、1 が出力されます)。

print関数内のキャストで使用される無名構造体と、 の最初のメンバーである無名構造体を考えてましょstruct container main.c。それらは「別々の翻訳単位で宣言された型」と見なすことができますか? また、他のすべての互換性要件を本当に満たしていますか、それとも何か誤解していますか?

0 投票する
4 に答える
1991 参照

c - C: さまざまなタイプの匿名または無名のネストされた構造体にアクセスする方法

0 投票する
0 に答える
583 参照

c++ - パス 2 でコンパイラのヒープ領域が不足しています - 匿名共用体、匿名構造体、constexpr コンストラクター、静的メンバー

次のエラーで Visual Studio 2015 Community Edition でコンパイルに失敗するコードがあります。

致命的なエラー C1002: パス 2 でコンパイラがヒープ領域を使い果たしました

コード

これは試行錯誤によって失敗状態を要約することができた最も単純なものですが、まだかなりのことが進行中です。

私が唖然としたのは、次の各変更により、問題なくコンパイルされることです...

のコンストラクターconstexprから削除すると機能します。B

Aの変数を not に変更staticすると、機能します。

ラッパーの代わりにプレーンintinBの秒unionを使用すると、機能します。structint

を渡すのではなく、のコンストラクターでxデフォルトで初期化すると、機能します。B1

最後に、構造体からBsunionIntメンバーを取り出すと、機能します。

言うまでもなく、私は完全に途方に暮れています。私よりもコンパイラをよく理解している人からの支援をいただければ幸いです。

0 投票する
2 に答える
311 参照

c++11 - VS2013 で匿名構造体のブレースまたはイコール初期化子が機能しない

構造体内の匿名構造体のブレースまたはイコール初期化子は、VS2013 によって生成された出力に対して機能しません。コードがあります:

Linux で次のコマンドを使用してコンパイルします。

(最適化フラグを追加しても結果には影響しません)

期待される結果:

変。VS2013 でそれを実行すると、ガベージ値が返されます。C++11 標準を正しく実装するという点で、これについて正しいのは誰ですか? これがGCCのせいだとは思えません。

役に立たないVSコンパイラオプションと関係がありますか? Windows 拡張機能? MS が作成したバグのため、構造体のデフォルト コンストラクタを作成する必要がありますか? これはばかげています。