問題タブ [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 に答える
158 参照

c - 4D行列タイプで匿名構造を使用する場合の警告

カプセル化された(裸の配列ではない)Cで(iOS / ObjC環境で使用するための)4次元行列型を定義しようとしています。これは、インデックス値または名前付き構造体メンバーを介してアクセスできます。これは私の試みです:

これは機能しますが、匿名の(名前のない)構造体が原因で警告が表示されます。コンテナ構造体は4つの内部構造体を保持するためだけに機能するため、この名前を付けたくないのは明らかです。

このページは、私がこれを行うことができるはずだということを意味しますか? http://gcc.gnu.org/onlinedocs/gcc/Unnamed-Fields.html#Unnamed-Fields

実際に機能しているようですが、これは間違っていますか、そうでない場合は、警告をどのように取り除く必要がありますか?

LLVMGCC4.2を使用しています。

洞察や提案をありがとう。

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

c - 共用体と無名構造体を使用した C モジュラス

a%b をすばやく取得するために、ユニオンで匿名構造体を使用しています。

b に 2 の累乗を使用せずに a%b を取得する他の方法を知っていますか?

リストを含める:

および労働組合の宣言:

そしてここに主な機能があります:

おそらくいくつかの配列で事前に計算された値ですか?しかし、% calc の部分を 1 回だけ使用する場合、これは同じです。ビット単位の操作マニュアルに関する書籍の参考文献を教えてください。

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

c++ - C++ での C ライブラリの無名構造体型の処理

多くのレガシー コードと、C で記述されたいくつかの外部ライブラリを含む、大きくて古い C++ アプリケーションがあります。これらのライブラリは、バグが見つかり、ベンダーがパッチを提供した場合にのみ更新されることはほとんどありません。これは先週 1 つのライブラリで発生し、新しいバージョンを統合すると、ライブラリをローカルで変更しないと (以前のバージョンで行ったようです)、ビルドが次のエラー メッセージで中断することがわかりました。

これは、ライブラリが次のような多数のハンドル タイプを宣言しているためです。

一部のクラスの関数シグネチャで使用します。

_Opaque 構造体には名前がないため、コンパイラは関数の適切な名前マングル名を作成できないため、上記のエラーが発生します。

これに対する現在の回避策は、構造体に明示的に名前を付けて、ライブラリ ヘッダー ファイルにパッチを適用することです。

可能であればライブラリに触れたくないので、これは明らかに悪いことです。もう1つのさらに悪いオプションはvoid*、すべての関数シグネチャで型を変換し、それぞれの型にキャストし直すことです。そして、影響を受けるすべての関数を純粋な C で書き直すという最悪の選択肢があります...

だから、私の質問は次のとおりです。ライブラリにパッチを適用するよりも良いオプションはありますか? 私が見落としている簡単な解決策はありますか?これを解決する最善の方法は何ですか?

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

c - これはclangのバグですか?typedefの匿名構造体

私はこのtypedefを次のような構造体に使用しました

デバッガーでこのインスタンスを見ると、次のような非常に奇妙な出力が得られます。

ACVectorの定義をに変更した場合

デバッガーでも同じことをします。期待どおりの結果が得られます。

typedefに匿名構造体を使用することは合法です

OK、もっとコード

_translationの宣言はインスタンス変数として行われます

この関数を使用して変数を初期化します

このような

もともとは

また、デバッガーの出力で緯度と経度の要素はどこから取得されますか。個別にアクセスすることはできません。

他の場所で定義されたACVectorに対応する詳細情報

私には2つの定義があります

興味深いことに、これに直接続く

これはおそらくACVectorの緯度と経度の発生を説明することができます

ライブラリを含むACVectorのすべてのオカレンスを検索しましたが、定義されているACVectorの他のオカレンスを見つけることができませんでした

これはすべてXcode4.5ゴールドマスターを使用しています

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

c++ - ネストされた無名構造体で C++ プライベート修飾子が無視される

次のサンプル コードは、Visual C++ で正常にコンパイルされます。

しかし、なぜ?メンバーはそのコンテナーのコンテナーのようにprivateDataなっているはずなので、関数 main にアクセスできないため、コンパイラ エラーが発生することが予想されます。private名前のない構造体が公式の C++ の一部ではないことは知っていますが、この設計は馬鹿げています。

ちなみに、私もに変更しようとprivateprotectedましstructunion: コンパイラは、別の匿名構造体またはユニオン内にネストされている匿名構造体およびユニオンのアクセス修飾子を受け入れることを拒否しているようです。

誰かがこの機能を説明できますか?

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

c++ - 名前のない構造体、共用体、クラスを名前付きの同等のものに置き換える方法は?

プロジェクトのリファクタリングを実行し、クラス、構造体、共用体を含むすべての匿名名前空間を削除したいと考えています。最も簡単な方法で、名前付きの同等のものに置き換えたいと思います。私の知る限り、匿名名前空間に相当するものは次のとおりです。

そのようなコード:

次と同等です。

リンク:匿名の名前空間のあいまいさ

このような簡単なケースでは、構造体、共用体、クラスに一意の名前を設定するだけで十分です。

1) そのようなコード:

と同等です

2) そのようなコード:

次と同等です。

しかし、そのような場合はどうすればよいですか、私にはわかりません:

ご覧のとおり、匿名の構造体が匿名の名前空間であるのと同じ方法で、匿名の構造体のメンバーにアクセスできます。しかし、同様の方法で struct を定義することはできません。例えば:

構造体内で名前空間を定義することもできないため、この例の「名前空間」キーワードの「構造体」を単に置き換えることはできません。

では、匿名の構造体、共用体、クラスの名前を「問題の例」および一般的に考えられるすべての例に設定する最も簡単な方法は何ですか?

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

c++ - C++ 匿名構造体

次のユニオンを使用して、バイト、ニブル、およびビット操作を簡素化します。

うまく機能しますが、次の警告も生成されます。

警告: ISO C++ は無名構造体を禁止しています [-pedantic]

わかりました。しかし...私のg ++​​出力からこの警告を取得するにはどうすればよいですか? この問題なしでこのユニオンのようなものを書く可能性はありますか?

0 投票する
3 に答える
2450 参照

c - 宣言付きの無名 C 構造体

次の定義を考慮します。

「匿名構造体」タイプの変数「ポイント」を宣言していますが、構造体定義の外(おそらくメイン関数内)で同じタイプの別の変数を宣言する方法はありますか?

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

c - これは C11 匿名構造体ですか?

私はC11ドラフトを調べていましたが、

タグのない構造体型の名前のないメンバーは、匿名構造体と呼ばれます。タグのない共用体型の名前のないメンバーは、無名共用体と呼ばれます。無名の構造体または共用体のメンバーは、それを含む構造体または共用体のメンバーと見なされます。

だから私は次のテストケースを構築しました

Clang と GCC はどちらも、名前のないメンバーについて不平を言い、宣言は効果がないと言っています。私は何か間違ったことをしましたか、それとも彼らは単にその機能をまだサポートしていませんか?

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。それらは「別々の翻訳単位で宣言された型」と見なすことができますか? また、他のすべての互換性要件を本当に満たしていますか、それとも何か誤解していますか?