1

前処理の前に ac/c++ ファイルを調べることはできますか? それとも、中途半端な前処理の後ですか?基本的には

#define <commonly_used_word> 0

サードパーティのライブラリ ヘッダーで、それがどこにあるかを把握したいと考えています。したがって、基本的には、コンパイラにすべてのヘッダーを含めてもらいたいだけですが、プリプロセッサ自体は含めないようにします。

4

4 に答える 4

5

元のソース ファイル、前処理前のファイルです。

ディレクティブを処理したいように聞こえますが#include、マクロを非置換のままにしたいのです。どちらのアクションもプリプロセッサによって実行されます。

C および C++ では、次のようにインクルード ファイル名としてマクロを使用することは合法であるため、一般的には不可能です。

#define INCLUDE_FILE "stdio.h"
#include INCLUDE_FILE 

目的を達成するには、要求を満たすように特別に設計されたプリプロセッサが必要です。私は、そのようなプリプロセッサの実装を知りません。

特定のマクロが定義されている場所を見つけたい場合は、次のトリックを試すことができます:ヘッダーを含める前に同じ名前で独自のマクロを定義し、コンパイルを開始します。コンパイラ (プリプロセッサ) は、同じマクロのライブラリ定義に遭遇すると、マクロの再定義について警告し、その場所を指摘する必要があります。

于 2012-08-20T22:26:07.303 に答える
2

GCC 固有-M-MMオプションがあります。

インクルード ファイルの絶対パスを一覧表示するには、-M を使用します。

前処理の結果を出力する代わりに、メインのソース ファイルの依存関係を記述した make に適したルールを出力します。プリプロセッサは、そのソース ファイルのオブジェクト ファイル名、コロン、および -include または -imacros コマンド ライン オプションからのファイルを含むすべてのインクルード ファイルの名前を含む 1 つの make 規則を出力します。gcc -M test.c

のようなシステム インクルードを望まない場合は #include <stdio.h>、-MM Like -M を使用しますが、システム ヘッダー ディレクトリにあるヘッダー ファイルや、そのようなヘッダーから直接的または間接的にインクルードされるヘッダー ファイルについては言及しません。gcc -MM test.c

これにより、検索範囲が大幅に狭まる可能性があります。

http://www.math-linux.com/spip.php?article263

于 2012-08-20T22:34:41.580 に答える
1

探している定義が含まれているヘッダー ファイルがわかっている場合 (例: find と grep を提案どおりに使用)、現在のソース ファイルに影響を与えているヘッダー ファイルを特定するには、gcc にヘッダー インクルージョン ツリーを出力させます。gcc のドキュメントで説明されているように、-H オプションを使用してこれを実現できます。通常の処理を排除するために -MG と組み合わせることができます。

于 2012-08-20T22:41:41.280 に答える
1

オプション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
于 2012-08-20T22:39:29.423 に答える