4

非常に多くのコンパイル オプションを含む複雑な C コードを使用しています。これにより、コードが非常に読みにくくなります。実際にコンパイルされた方法を反映したコードのコピーを作成したいと思います。最近まで知らなかった「unifdef」ユーティリティを使用して、かなり良い結果が得られました。しかし、なぜ呼び出すのが難しいのか、私は戸惑い、何かが欠けているのではないかと思っています.

次の例を検討してください。

#ifdef A
  printf("A\n");
#endif
#ifdef B
  printf("B\n");
#endif

「unifdef -DA jump.c」で unifdef を呼び出すと、次のようになります。

  printf("A\n");
#ifdef B
  printf("B\n");
#endif

B が未定義であることを unifdef に伝えていないため、取り出されませんでした。

unifdef -DA と言うと、代わりに次のようにユーティリティが動作するようにしたいと思います。

  printf("A\n");

これは、C プリプロセッサが実際に行っていることと一致します。未定義の分岐はすべて省略されます。

unifdef でこの動作を取得するには、「unifdef -DA -UB jump.c」を使用して、B が未定義であることを明示的に伝える必要があるようです。多分私はそれを呼び出すためのより簡単な方法を逃した.

私が使用しているコードの Makefile から必要な -D フラグと -U フラグの長いリストを生成する Python スクリプトを作成しました (通常、ルーチンごとに 80 個)。そして結果は素晴らしいです。しかし、そのようなスクリプトが実際に必要かどうかは疑問です。

別のユーティリティ (sunifdef? coan?) に、目的の動作が既に組み込まれている可能性もあります。もしそうなら、それについて言及してください。

4

3 に答える 3

8

ユーティリティは、フラグcoanを使用して必要なことを行います。-m

$ coan source -DA -m test.c 
  printf("A\n");

マニュアルページから:

-m, --implicit
    Assume that any symbol that is not --define-ed is implicitly
    --undef-ed.
于 2013-01-24T00:55:12.063 に答える
1

私があなたの質問を正しく理解していれば、プリプロセッサが実行された後のコードを見たいと思っていますよね? それでは、プリプロセッサを実行させて、生成される出力を確認してみませんか? コンパイル時に使用するのとまったく同じ引数を使用してコンパイル呼び出しを実行するだけですが、それに引数-Eを追加します。これは、「前処理だけを行う」ことを意味します。

$ cat preproc.c 
#ifdef A
  printf("A\n");
#endif
#ifdef B
  printf("B\n");
#endif

$ gcc -E preproc.c 
# 1 "preproc.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "preproc.c"

$ gcc -E -DA preproc.c 
# 1 "preproc.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "preproc.c"

  printf("A\n");

$ gcc -E -DB preproc.c
# 1 "preproc.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "preproc.c"




  printf("B\n");

$
于 2013-01-24T00:03:18.307 に答える