2011-01-14 23 views
0

ライブラリ内の構造体(C言語)の要素(名前&)を判別することはできますか?はいの場合、C言語でそれを行うには? C言語がそれをサポートしていない場合、他のトリックで構造要素を取得することは可能ですか、それとも何かツールがありますか?構造体の要素をC言語で検索する

答えて

3

いいえ、できません。 Cには組み込みのリフレクションスタイルのサポートはありません。

5

あなたはプログラミング時に、または実行時に動的に調べることを意味しますか?

前者については、確かに。あなたが含んでいる.hファイルを見つければ、そこにすべてのフィールドを含む構造体定義が見つかります。

後者のため、できません。 Cは構造体を機械コードにコンパイルし、この情報がすべて失われるようにします。たとえば、構造体{int x, float y, int z}を持っていて、マシンコードに

a = mystruct.y 

を言ういくつかのコード、残ることすべてがそれに4を追加し、mystructへのポインタを見つけるようなものである(の大きさを持っている場合int)を読み込み、そこから4バイトを読み込んだ後、浮動小数点演算を行います。それらの構造体フィールドの名前も型も全くアクセスできないため、実行時にそれらを見つける方法はありません。

+0

返信いただきありがとうございますが、マシンコードの中でどのようにポインタを見つけるのですか? –

+0

あなたはアセンブリを読んで、それを理解する必要があります(全く異なる言語)。しかし、私はそれがあなたが意味するものだとは思わない。私が「ミスタルへのポインタを見つけるようなもの」と言ったとき、あなたは誤解されたかもしれません。私は、生成されたコードが 'mystruct'がどこにあるのか知っていることを意味します(おそらくスタックからアドレスを取るかもしれません)。そして、それは必要な算術を実行します。しかし、実行時にフィールドの名前と型を知るための十分な情報がありません。 – mgiuca

0

「構造体の要素を決定する」とは、「構造型の宣言をプログラム的に取得する」という意味で、少なくとも移植可能ではないと考えています。 JavaのC++のようなより現代的な言語とは対照的に、Cは型情報を実際のプログラムで利用可能な形式で保持しません。

EDIT:

それは「移植性」は不可能であることについての私のコメントを明確にする:

非常によく、それが生成するオブジェクト・ファイルに必要な情報を埋め込むことになるいくつかのコンパイラ+デバッグ・フォーマットの組み合わせがあるかもしれません私はを知っているとは言えませんが、を知っています。その後、プログラムが独自の実行可能ファイルを開いて、デバッグ情報を解析するようにすることができます。しかし、これはせいぜい面倒で壊れやすいアプローチです...

どうしてそんなことをする必要がありますか?

+0

私はAPIを使ってデータをパックしている構造体を持っていますが、コンソールに値を表示しようとすると正しい値が表示されません。ですから、データが格納されている構造体の正確な場所を知っていれば、それを印刷して構造体の特定の要素を見つけることができます。 –

+0

@ S.Man:いくつかのサンプルコードで質問を更新できますか?可変フォーマットの構造体を生成する(ほとんどの場合、共用体を使用して)構造体を生成するほとんどのC APIには、各インスタンスがどのフォーマットに適合しているかを知るためのフィールドが1つ以上あります。フォーマットが可変でない場合、要素を直接参照する必要があります。 – thkala

+0

@ S.Manあなたは、整列(パッキング)の問題を経験しているかもしれません.... – T33C

関連する問題