10

さまざまなヘッダー ファイルに #define foo があるとします。それはいくつかの異なるものに展開する可能性があります。(.cc ファイルをコンパイルするときに) #define が発生したとき、それが展開される対象、それがどのファイルで、どこからインクルードされたかを知りたいです。

出来ますか?そうでない場合、役立つ可能性のある部分的な解決策はありますか?

明確化のリクエストでコメントを自由に追加してください。

編集: 現在の回答は、#define が 1 つある場合に集中しているようで、定義にジャンプするか、定義が何であるかを知りたいだけです。それは単純なケースであり、はい、あなたのソリューションは機能します。しかし、異なるファイルに同じ #define があり、どれが最初に実行されるかを知りたい場合、これらの手法はどれも役に立ちません。さて、私は実際に #warning を慎重に使用して適切な場所を見つけました。しかし、これには多くの作業が必要です。

4

6 に答える 6

18

ほら :

# shows preprocessed source with cpp internals removed
g++ -E -P file.cc
# shows preprocessed source kept with macros and include directives 
g++ -E -dD -dI -P file.cc  

上記の内部は gcc の行マーカーであり、出力を読むときに少し混乱します。-Pそれらを取り除きます

-E 前処理段階の後に停止します。コンパイラを適切に実行しないでください。  
     出力は、前処理されたソース コードの形式で、
     標準出力。

     前処理を必要としない入力ファイルは無視されます。

注:コメントは、これが部分的な解決策にすぎないと正しく訴えています。マクロがいつ置き換えられるかはわかりません。とにかく役立つ前処理されたソースが表示されます。

于 2008-11-14T18:48:32.870 に答える
5

(.cc ファイルをコンパイルするとき) #define が発生したときを知りたいのですが、

私はそれに対する解決策を知っています。既に不正な C++ コードとして定義されているシンボルを使用してファイルをコンパイルします (リンク先の記事では「@」が使用されています)。したがって、GCCの場合は次のように記述します

gcc my_file.c -Dfoo=@

それが展開されると、構文エラーが発生することが保証されており、コンパイラは構文エラーがどのファイルにあるかを教えてくれるはずです。これは非常に役立ちます。

Raymond Chen が提案するトリックを使用すると、コンパイラは「競合する」定義がどこから来たのかを教えてくれるかもしれません。しかし、保証はありません。私はマクロを使用していないので (const と enum の方が好きです)、GCC がこの点で優れたコンパイラの 1 つであるかどうかはわかりません。プリプロセッサが実行されると、あらゆる種類の有用な情報が失われることを除いて、C または C++ 標準がこれについて何も述べていないと思います。

于 2008-11-15T00:45:09.607 に答える
2

定義された場所を見つけるのに役立ちませんが、 -E -dM フラグを使用して特定のファイルの定義を確認できます

g++ -E -dM file.cpp | grep MACRO
于 2008-11-14T18:51:49.993 に答える
1

優れたIDEは、定義へのジャンプの形式を介して、オンデマンドでこれを行うことができます。

于 2008-11-14T19:20:33.490 に答える
1

「展開するもの」については、前処理された出力を提供する gcc で -E スイッチを使用します。しかし、どのマクロがどこから来たか (またはマクロがあったかどうか) のバックトレースはありません。

別のオプションとして -g3 を使用できます。これにより、マクロに関するデバッグ情報が追加されます。つまり、後でデバッガーで各マクロの定義を確認できます。

于 2008-11-14T18:51:26.607 に答える
0

#警告を使用します。ここに 記載。

于 2008-11-14T18:48:03.400 に答える