2016-11-30 19 views
3

私は大きな(C)プロジェクトからコードを切り出しました。コードには多くの多くのマクロが定義されています。その中には元の大きなコードベースでのみ使用されるものと、切り取ったコードの一部で使用されないものがあります。コードで使用するマクロをすばやく確認するにはどうすればよいですか?

これらのマクロのうち、実際に使用されているマクロと使用されていないマクロをすばやく特定したい場合があります。私はそれらを使用するコードパスが取られるかどうかは気にしません(つまり、if (1+1 == 3) { MY_MACRO(a,b,c); }が私の関心事である限り使用しています)。

私が考えることができる最高のものは前処理です-Eですべてと何とかマクロを言及し、ソース位置のコメントを探し

注:

  • あなたはまた、使用中の機能を示しています解決策を持っている場合、それはあまりにも大丈夫です
  • 。私は、コード私はプロジェクトを切り捨てました。あなたのソリューションが、多くの人がエントリポイントから実際に呼び出される関数内のマクロに制限することができれば、より良い結果になります。
  • 私のコードがコンパイルされて実行されます(gprofの出力が助けになる場合もあります)
  • すべてのマクロを、明らかに実現可能であるものの、面倒です。私はそれを必要としない解決策が必要です。
  • プリプロセッサによって除外されたコードは使用されません。しかし、あなたがこの制限を守らない解決策を持っているなら、それは何もないよりも優れています。
  • 私は"dump the list of preprocessor defines"にしたくありませんが、使用されているを定義しています。
+4

すべての '#define'ディレクティブをコメントアウトして再構築してください。どのシンボルが苦情を受けているか確認してください。 –

+2

Sidenote:コードがコンパイルされているので、マクロの削除前後でバイナリを比較してください。条件付きコンパイルで使用されるマクロを誤って削除して、警告やエラーが発生することがあります。 – user694733

+0

@Someprogrammerdude:編集を参照してください。私はそれよりも怠惰になりたい。 – einpoklum

答えて

3

clangpp-traceという名前のツールが存在します。そのプリプロセッサ呼び出しをそのパラメータで出力します。

あなたはMacroExpandsイベントに興味がある、それはpp-trace出力にそうようになっていますMacroExpandsブロックからMacroNameTokを抽出

... 

- Callback: MacroExpands 
    MacroNameTok: X_IMPL 
    MacroDirective: MD_Define 
    Range: [(nonfile), (nonfile)] 
    Args: [a <plus> y, b] 

... 

はあなたのためにトリックを行う必要があります。

+0

denissはclang-3.8で利用できますか?私はKubuntu 16.04のディストリビューションで見つけられません。 – einpoklum

+0

@einpoklum、そうすべきです。残念ながら、私はソースからビルドしているだけなので、バイナリとして再配布されているかどうかは不明です。 – deniss

+0

さて、あなたは知っているだけです:[それは* buntu 16.04にはなく、誰もその理由を知っていません。](http://askubuntu.com/posts/comments/1319419?noredirect=1)。 – einpoklum

関連する問題