前処理の前に ac/c++ ファイルを調べることはできますか? それとも、中途半端な前処理の後ですか?基本的には
#define <commonly_used_word> 0
サードパーティのライブラリ ヘッダーで、それがどこにあるかを把握したいと考えています。したがって、基本的には、コンパイラにすべてのヘッダーを含めてもらいたいだけですが、プリプロセッサ自体は含めないようにします。
前処理の前に ac/c++ ファイルを調べることはできますか? それとも、中途半端な前処理の後ですか?基本的には
#define <commonly_used_word> 0
サードパーティのライブラリ ヘッダーで、それがどこにあるかを把握したいと考えています。したがって、基本的には、コンパイラにすべてのヘッダーを含めてもらいたいだけですが、プリプロセッサ自体は含めないようにします。
元のソース ファイルは、前処理前のファイルです。
ディレクティブを処理したいように聞こえますが#include
、マクロを非置換のままにしたいのです。どちらのアクションもプリプロセッサによって実行されます。
C および C++ では、次のようにインクルード ファイル名としてマクロを使用することは合法であるため、一般的には不可能です。
#define INCLUDE_FILE "stdio.h"
#include INCLUDE_FILE
目的を達成するには、要求を満たすように特別に設計されたプリプロセッサが必要です。私は、そのようなプリプロセッサの実装を知りません。
特定のマクロが定義されている場所を見つけたい場合は、次のトリックを試すことができます:ヘッダーを含める前に同じ名前で独自のマクロを定義し、コンパイルを開始します。コンパイラ (プリプロセッサ) は、同じマクロのライブラリ定義に遭遇すると、マクロの再定義について警告し、その場所を指摘する必要があります。
GCC 固有-M
の-MM
オプションがあります。
インクルード ファイルの絶対パスを一覧表示するには、-M を使用します。
前処理の結果を出力する代わりに、メインのソース ファイルの依存関係を記述した make に適したルールを出力します。プリプロセッサは、そのソース ファイルのオブジェクト ファイル名、コロン、および -include または -imacros コマンド ライン オプションからのファイルを含むすべてのインクルード ファイルの名前を含む 1 つの make 規則を出力します。gcc -M test.c
のようなシステム インクルードを望まない場合は
#include <stdio.h>
、-MM Like -M を使用しますが、システム ヘッダー ディレクトリにあるヘッダー ファイルや、そのようなヘッダーから直接的または間接的にインクルードされるヘッダー ファイルについては言及しません。gcc -MM test.c
これにより、検索範囲が大幅に狭まる可能性があります。
探している定義が含まれているヘッダー ファイルがわかっている場合 (例: find と grep を提案どおりに使用)、現在のソース ファイルに影響を与えているヘッダー ファイルを特定するには、gcc にヘッダー インクルージョン ツリーを出力させます。gcc のドキュメントで説明されているように、-H オプションを使用してこれを実現できます。通常の処理を排除するために -MG と組み合わせることができます。
オプションcpp
を使用して、含まれるファイルのリストを生成するように指示できます。-M
$ cpp -M a.c
a.o: a.c /usr/include/stdio.h /usr/include/features.h \
/usr/include/sys/cdefs.h /usr/include/bits/wordsize.h \
/usr/include/gnu/stubs.h /usr/include/gnu/stubs-64.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/include/stddef.h \
/usr/include/bits/types.h /usr/include/bits/typesizes.h \
/usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h \
/usr/lib/gcc/x86_64-pc-linux-gnu/4.7.1/include/stdarg.h \
/usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h
Makefile ルール形式が提供されますが、それを無視して他のコマンドで使用できます。
たとえば、シンボルをgrepできます(ここでは、実際のファイル名ではなく、怠惰であるため、stderrを無視しています)\
:a.o:
$ grep '#\s*define\s*BUFSIZ' $(cpp -M a.c) 2>/dev/null
/usr/include/stdio.h:# define BUFSIZ _IO_BUFSIZ
次のようなプログラムを使用しctags
て、シンボルを見つけることもできます。
$ ctags $(cpp -M a.c)
...
$ grep BUFSIZ tags
BUFSIZ /usr/include/stdio.h 128;" d