ライブラリ内の構造体(C言語)の要素(名前&)を判別することはできますか?はいの場合、C言語でそれを行うには? C言語がそれをサポートしていない場合、他のトリックで構造要素を取得することは可能ですか、それとも何かツールがありますか?構造体の要素をC言語で検索する
答えて
いいえ、できません。 Cには組み込みのリフレクションスタイルのサポートはありません。
あなたはプログラミング時に、または実行時に動的に調べることを意味しますか?
前者については、確かに。あなたが含んでいる.hファイルを見つければ、そこにすべてのフィールドを含む構造体定義が見つかります。
後者のため、できません。 Cは構造体を機械コードにコンパイルし、この情報がすべて失われるようにします。たとえば、構造体{int x, float y, int z}
を持っていて、マシンコードに
a = mystruct.y
を言ういくつかのコード、残ることすべてがそれに4を追加し、mystruct
へのポインタを見つけるようなものである(の大きさを持っている場合int)を読み込み、そこから4バイトを読み込んだ後、浮動小数点演算を行います。それらの構造体フィールドの名前も型も全くアクセスできないため、実行時にそれらを見つける方法はありません。
「構造体の要素を決定する」とは、「構造型の宣言をプログラム的に取得する」という意味で、少なくとも移植可能ではないと考えています。 JavaのC++のようなより現代的な言語とは対照的に、Cは型情報を実際のプログラムで利用可能な形式で保持しません。
EDIT:
それは「移植性」は不可能であることについての私のコメントを明確にする:
非常によく、それが生成するオブジェクト・ファイルに必要な情報を埋め込むことになるいくつかのコンパイラ+デバッグ・フォーマットの組み合わせがあるかもしれません私はを知っているとは言えませんが、を知っています。その後、プログラムが独自の実行可能ファイルを開いて、デバッグ情報を解析するようにすることができます。しかし、これはせいぜい面倒で壊れやすいアプローチです...
どうしてそんなことをする必要がありますか?
私はAPIを使ってデータをパックしている構造体を持っていますが、コンソールに値を表示しようとすると正しい値が表示されません。ですから、データが格納されている構造体の正確な場所を知っていれば、それを印刷して構造体の特定の要素を見つけることができます。 –
@ S.Man:いくつかのサンプルコードで質問を更新できますか?可変フォーマットの構造体を生成する(ほとんどの場合、共用体を使用して)構造体を生成するほとんどのC APIには、各インスタンスがどのフォーマットに適合しているかを知るためのフィールドが1つ以上あります。フォーマットが可変でない場合、要素を直接参照する必要があります。 – thkala
@ S.Manあなたは、整列(パッキング)の問題を経験しているかもしれません.... – T33C
- 1. 構造体内の配列要素にアクセスする(構造体の配列の一部です)(C言語)
- 2. C++で構造体を検索する
- 3. C言語で15bit構造体
- 4. 自然言語文構造の検索
- 5. C++:構造体要素
- 6. C言語:構造体と配列
- 7. C:構造体内の構造体要素へのポインタ
- 8. のC#:検索と構造体
- 9. C言語で構造体の配列を処理するマルチスレッド
- 10. 構造体と関数をC言語で記述するプログラム
- 11. 構造体と配列をC言語で使用する
- 12. "C言語で共有メモリの構造体メンバにアクセスする"
- 13. C言語で異なる構造体のポインタの配列
- 14. C言語の配列に構造体を追加する
- 15. C言語の構造体にexternを使用する
- 16. 構造体をC言語で宣言せずに宣言する
- 17. C言語のtypedef構造体の意味は何ですか?
- 18. C言語、ファイルの構造
- 19. 構造体をC言語で参照渡しします
- 20. 検索及び構造体
- 21. C++で構造体を解析し、値を検索する
- 22. 構造体をC言語の関数に渡す
- 23. VimはC言語の構造体をオートコンプリートします
- 24. Go言語の構造体の配列
- 25. C言語で構造体を再割り当て
- 26. 構造体のアドレスをC言語のファイルに書く方法
- 27. 構造体Cの配列を検索する方法
- 28. C言語のファイルコンテンツを検索する
- 29. Cの構造体宣言の配列
- 30. Cの構造体の前方宣言?
返信いただきありがとうございますが、マシンコードの中でどのようにポインタを見つけるのですか? –
あなたはアセンブリを読んで、それを理解する必要があります(全く異なる言語)。しかし、私はそれがあなたが意味するものだとは思わない。私が「ミスタルへのポインタを見つけるようなもの」と言ったとき、あなたは誤解されたかもしれません。私は、生成されたコードが 'mystruct'がどこにあるのか知っていることを意味します(おそらくスタックからアドレスを取るかもしれません)。そして、それは必要な算術を実行します。しかし、実行時にフィールドの名前と型を知るための十分な情報がありません。 – mgiuca