0

ソースファイル (*.c) でいくつかのマクロを使用しています。

コンパイル中またはライブラリから、この特定のマクロが解決された正確なヘッダー ファイルを特定できる方法はありますか?

問題は、一部のヘッダー ファイルで 10 に定義されたマクロを使用しているが、コードで受信される値が 4 であることです。そのため、すべての dep ファイルにアクセスしてチェックインする代わりに、マクロが解決されたソースを特定する直接的な方法がある場合に備えて知りたいと考えています。

4

3 に答える 3

7

ファイルに対して cpp (C プリプロセッサ) を実行すると、出力には次の形式の #line ディレクティブが含まれます。

#line 45 "silly-file-with-macros.h"

すべてがどこから来たかを言うコンパイラのために。したがって、1つの方法は使用することです

 cpp my-file.c | more

#lineディレクティブを探します。

コンパイラによっては、使用できる別のトリックはマクロを別のものに再定義することであり、コンパイラは次のような警告を吐き出します

test-eof.c:5:1: warning: "FRED" redefined
test-eof.c:3:1: warning: this is the location of the previous definition

(これはgccからのものです)マクロが以前に定義された場所を教えてくれるはずです。しかし、考えてみると、まだその警告を受けていないのはどうしてですか?

別のアイデアは、 を使用makedependして、含まれているすべてのファイルのリストを取得し、それらの#define行を grep することです。

于 2009-10-21T14:06:05.300 に答える
2

#define の grep?

于 2009-10-21T14:06:25.030 に答える
0
find / -name '*.h' | xargs -L 100 grep -H macroname

そこには3つのコマンドがあります。find コマンドは、検索するファイルを選択するので、それを ' .c' や ' .cpp' など、必要なものに変更できます。次に、xargs コマンドは、ファイルのリストを一度に 100 に分割して、内部シェル コマンドのバッファー サイズをオーバーフローさせないようにします。次に、100 ファイルのリストごとに grep コマンドが繰り返し実行され、macroname を含むファイル名とそれを使用するコード行が出力されます。

これから、再定義されている場所を確認できるはずです。

于 2009-10-21T14:08:12.490 に答える