1

Cファイルがあります(簡単にするために、何も含まれていないと仮定します)。この C ファイルを適切にコンパイルするには、リテラル数の定義がいくつか必要です。これらがどの定義であるかを調べたいと思います。

当然のことながら、ファイルをコンパイルしようとすると、ある時点で失敗し始めます。いくつかの障害回復により、追加の定義に関する障害通知を受け取る場合があります。しかし - それは私が望むものではありません:

  • プログラムのコンパイルを完了することに興味はありません。構文ツリー (または何らかの単純化された構文ツリー) を構築するだけで十分です。
  • マクロが欠落していることを除けば、プログラムは構文的に正しいと推測できます。これは、C の場合、構文的に正しいことを意味するはずです。
  • 関連するマクロはすべて大文字、つまり[A-Z][A-Z_0-9]*) の形式であると想定できます。

未定義のマクロのリストを取得するための代替手段は何ですか?

動機: 実際には、動的コンパイル ライブラリに何かをフィードしています。必要なマクロがすべて定義されているかどうかを事前に確認したいのですが、ファイルに必要なマクロがアプリオリにわからない (つまり、入力ファイルごとに異なる可能性があります) )。

4

2 に答える 2

1

醜いフォールバックソリューション:

明らかに、フォールバックはプログラムをコンパイルすることです。ただし、無関係なメッセージと無関係なメッセージを最小限に抑えながらそうしてください。これはコンパイラに依存しますが、たとえば GCC では次のことができます。

  • 出力生成を避ける
  • 警告を抑制する
  • 注記を非表示
  • 厳密に標準に準拠し、GNU 拡張は使用しない
  • GCCが使用を主張するそれらのばかげた派手な引用符の使用を無効にします

...さまざまなコマンドラインスイッチを使用し、ファイルではなく標準入力ストリームから入力を受け取るようにする場合(メモの一部を抑制するためにこれまでに見つけた唯一の方法)。次のようになります。

  cat your_program.c \
|  LC_CTYPE=C gcc -std=c99 -fsyntax-only -x c -fcompare-debug-second -

出力は次のようになります。

<stdin>: In function 'mult':
<stdin>:3:18: error: 'MY_CONSTANT' undeclared (first use in this function)

ここで、プログラムが未定義のマクロ (= 宣言されていない識別子) 以外は正しい場合、シェル スクリプトを少し使用して上記を簡単に解析できます。

  cat your_program.c \
| LC_CTYPE=C gcc -std=c99 -fsyntax-only -x c -fcompare-debug-second - \
| sed -r '/error: /!d; s/^.*error: '"'//; s/'.*//;" \
| sort -u

これには、プログラムに完全に組み込むことができないというさらなる欠点があります。つまり、プログラムでライブラリを使用して部分コンパイルを呼び出し、プログラムで出力を解析することはできません。system()タイプの呼び出しが必要です。

注: プログラムに他のエラーが発生する可能性がある場合は、sedコマンドで行を削除するパターンをもう少し具体的にする必要があります。

于 2021-06-01T16:24:33.710 に答える