2016-10-15 33 views
2

Cプログラムは構造体の定義を出力できますか?メンバ名は素晴らしいですが、データ型(配列の場合は配列の長さ)の順序付きリストで十分です。GCC - 構造体の定義を出力する

これを達成するためのプリプロセッサディレクティブを探していましたが、何も見つかりませんでした。コードの注釈付き部分を取得して#define変数として使用できるプリプロセッサディレクティブがありますか?もしそうなら、#define変数の値を保持するためにいくつかの変数を初期化することができます。このような構造は、プリント取得例えば

struct foo{ 
int a; 
char b; 
short arr[6]; 
} 

またはフォーマットがあれば構造は、データから再作成することができるように重要ではないが、この

struct s{ 
int m1; 
char m2; 
short m3[6]; 
} 

などは、です。したがって、このようなものもうまくいきます。

s{int,char,short[10]} 

これはリソースに制約のあるARMベースのデバイスです。

私は手動で構造体のコードをprintステートメントに貼り付けてコピーしたくないです。構造体コードが変更され、print文が変更されていない場合は、結果が正しくありません。

+0

私が知る限り、標準Cにはありません。そして、Cプリプロセッサではなく(C#プリプロセッサマクロを意味する)、C自体の仕組みが分からないからです。 –

+2

@Rhymoidはそれに同意しません。プリプロセッサを使って問題のコードを '#define structname_code ... 'のためにコピーし、インスタンス化することもできます。 –

+0

"私は手動で構造コードを貼り付けてコピーしたくありません" - 独自のソースコードファイルをプログラムに読み込ませることができます。 – usr2564301

答えて

1

既にソースコードをお持ちの場合は、どうすればよいですか?

しかし、一般に、Cコンパイラは、例えば、コンパイル時に見たすべての構造を「リスト」します。コンパイラは内部のシンボルテーブルを保持しますが、誰もそれらを印刷する必要があるとは考えていません。また、コンパイル中に読み込まれるすべてのソースファイルとヘッダーファイルには、何百もの構造体と型が存在することがあります。

タイプ、フィールド、および変数の名前は、主にプログラマに意味を与えるためのものであることにも注意してください。編集後、多くの名前はなくなります。グローバル変数と欠落している外部変数だけが、リンク時にこれらを解決できるようにオブジェクトファイル内に名前を保持し、リンク後にこれらの名前はもう必要ありません。コンパイラは、たとえば、a->bを、が存在するメモリ内の場所に対して、bのオフセットに変換しています。

+0

"なぜあなたは既にソースコードを持っているのですか?私はIoTデバイスを内蔵しています。現場には、このようなデバイスがたくさんある可能性があります。デバイスはバイナリブロブを送信します。これらのデバイスは異なるファームウェアバージョンを実行している可能性があり、ブロブ構造はファームウェアのバージョンによって異なる可能性があります。従来のアプローチでは、ファームウェアのバージョンを伝えて、各バージョンのブロブ構造を認識させるようにしています。さらに問題を複雑にするために、デバイスメモリは、以前のファームウェアバージョンによって記憶されたデータを含むことができる。データを自明にしたいと思います。 – Dojo

+0

構造の認識に関係しない回避策があります。しかし、彼らは乱雑で制約があります。私はJSON/bJSONのアイディアが好きです。この唯一の欠点は、データのオーバーヘッドです。その代価を支払えば、すべてのノードが正常に通信するために同じバージョンになる必要がない非常に機敏な情報システムになります。 – Dojo

+0

そして、sprintfに構造体を貼り付けない理由は、質問自体に言及しています。おそらく最後の手段として私はそれをするだろうが、私はそれを行うより良い方法を見つけることを試みている。 1人のユーザーが実際にコメントにかなり使いやすいハックを残しました。 – Dojo

1

必要な情報が含まれ、プログラムによるアクセスが可能なオブジェクトファイル形式があります。そのうちの1つはDwarfです。デバッガは通常、この情報を使用します。

コードを実行しているのデバッグ情報にアクセスすることはできません(私はよく分かりません)。これは、Javaや.netファミリのような精巧なランタイムシステムで動作する言語のプログラムとの違いです。それらは自分自身で反射を使用することができます。

伝統的にコンパイルされた言語で書かれたプログラムでは、おそらく実行可能な実行可能ファイルそのものがオブジェクトファイルを開くでしょう。デバッガのように、プログラムでそれを調べます。これを考慮すると、ソースコード(CおよびC++では多くの型定義でヘッダーファイルの形式で使用可能でなければならない)を分析する方が簡単であると考えられます。しかし、コンパイラがあなたのためにソースをレキシングして解析し、簡単なアクセスが可能な素敵なデータ構造にすべての情報を入れるため、アイデアは欺かれているかもしれません。コンパイルプロセスのこの部分、すなわちフロントエンドのかなりの部分は、あなたがソースを操作する場合には、あなたが行う必要があります。

関連する問題