質問
ソースファイル(* .c)でマクロを使用しています。
コンパイル中またはライブラリから、この特定のマクロが解決されている正確なヘッダーファイルを特定できる方法はありますか?
問題は、ヘッダーファイルで#10に定義されたマクロを使用しているが、コードで受け取った値が4であることです。そのため、すべてのdepファイルをチェックインする代わりに、マクロが解決されたソースを特定する直接的な方法がある場合に備えて知りたいと思います。
解決
ファイルに対して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することです。
他のヒント
#defineのgrep?
find / -name '*.h' | xargs -L 100 grep -H macroname
そこには3つのコマンドがあります。検索コマンドは、検索するファイルを選択するので、「 .c」または「 .cpp」または必要なものに変更できます。次に、xargsコマンドは、ファイルのリストを一度に100に分割して、内部シェルコマンドのバッファーサイズがオーバーフローしないようにします。次に、100個のファイルのリストごとにgrepコマンドが繰り返し実行され、マクロ名とそれを使用するコード行を含むファイル名が出力されます。
これにより、どこで再定義されているかを確認できるはずです。