5

Linux で#include、C++ プロジェクトに必要なステートメントをすばやく特定する方法は何ですか?

つまり、誰かが Web からスニペットを提供したものの、必要な #include ステートメントを提供できなかったとします。Linux コマンドまたはコンパイラ コマンド オプションを実行し、欠落している関数またはクラスを特定し、おまけとして、ヘッダー ファイルにこれらのものがある可能性のあるハード ドライブを特定する方法はありますか。

4

5 に答える 5

4

基本的に、ソースとヘッダーを解析し、完全な依存関係グラフを作成するアナライザーが必要です。これを最後に読み込んでさらに処理できるようにします。

この目的のために、g ++とClangに関するジョンのアドバイスに従いますが、必要なものが得られたかどうかは非常に疑わしいです。

少なくとも g++ で実際にできることは、既存のインクルードのグラフを出力することです。-H オプションを使用してツリーを出力するか、-M オプションを使用してリストを取得します。

この関連トピックも参照してください: #include 依存関係を追跡するツール

まさにあなたが望むものではありませんが、そこに記載されているツールが役立つ場合があります。

于 2013-09-20T19:25:36.613 に答える
2

Clang の「include-what-you-use」ツールが必要だと思います。

于 2013-09-21T01:05:09.897 に答える
-1

必要に応じて最小限を意味する場合 (つまり、A に B が含まれ、B に C が含まれる場合、A に C を含める必要はありません)、簡単な方法はわかりません。

ただし、適切なアプローチの 1 つは、各 cpp ファイルに独自のヘッダー ファイルを最初に (プリコンパイル済みヘッダーの後に) インクルードすることです。ヘッダ。

また、妥当なサイズのプロジェクトは、レイヤー A がレイヤー C に依存するレイヤー B を認識している/レイヤー B に依存するようにレイヤーで設計する必要がありますが、下位レイヤーには上位レイヤーが含まれません (つまり、C にはレイヤー A からの何も含まれません)。

その場合、各 cpp または hpp のインクルードはレイヤー順 (A、B、C) である必要があります。これを行うと、レイヤー C ヘッダーのいずれかを削除 (一時的にコメントアウト) できるかどうかを簡単に確認できます。これは、ヘッダーの前にあるインクルードの 1 つが既にそれらをインクルードしているためです。これはかなり頻繁に発生し、各ファイルの #include の数を大幅に減らすことができます。

そうは言っても、コンパイラがよりスマートになったため、これは以前よりもはるかに重要な問題ではなくなりました。#pragma once とプリコンパイル済みヘッダーを組み合わせることで、インクルードの最適化に多くの時間を費やすことなく、ビルド時間を短縮できます。

于 2013-09-20T18:37:38.393 に答える