Linux で#include
、C++ プロジェクトに必要なステートメントをすばやく特定する方法は何ですか?
つまり、誰かが Web からスニペットを提供したものの、必要な #include ステートメントを提供できなかったとします。Linux コマンドまたはコンパイラ コマンド オプションを実行し、欠落している関数またはクラスを特定し、おまけとして、ヘッダー ファイルにこれらのものがある可能性のあるハード ドライブを特定する方法はありますか。
基本的に、ソースとヘッダーを解析し、完全な依存関係グラフを作成するアナライザーが必要です。これを最後に読み込んでさらに処理できるようにします。
この目的のために、g ++とClangに関するジョンのアドバイスに従いますが、必要なものが得られたかどうかは非常に疑わしいです。
少なくとも g++ で実際にできることは、既存のインクルードのグラフを出力することです。-H オプションを使用してツリーを出力するか、-M オプションを使用してリストを取得します。
この関連トピックも参照してください: #include 依存関係を追跡するツール
まさにあなたが望むものではありませんが、そこに記載されているツールが役立つ場合があります。
Clang の「include-what-you-use」ツールが必要だと思います。
必要に応じて最小限を意味する場合 (つまり、A に B が含まれ、B に C が含まれる場合、A に C を含める必要はありません)、簡単な方法はわかりません。
ただし、適切なアプローチの 1 つは、各 cpp ファイルに独自のヘッダー ファイルを最初に (プリコンパイル済みヘッダーの後に) インクルードすることです。ヘッダ。
また、妥当なサイズのプロジェクトは、レイヤー A がレイヤー C に依存するレイヤー B を認識している/レイヤー B に依存するようにレイヤーで設計する必要がありますが、下位レイヤーには上位レイヤーが含まれません (つまり、C にはレイヤー A からの何も含まれません)。
その場合、各 cpp または hpp のインクルードはレイヤー順 (A、B、C) である必要があります。これを行うと、レイヤー C ヘッダーのいずれかを削除 (一時的にコメントアウト) できるかどうかを簡単に確認できます。これは、ヘッダーの前にあるインクルードの 1 つが既にそれらをインクルードしているためです。これはかなり頻繁に発生し、各ファイルの #include の数を大幅に減らすことができます。
そうは言っても、コンパイラがよりスマートになったため、これは以前よりもはるかに重要な問題ではなくなりました。#pragma once とプリコンパイル済みヘッダーを組み合わせることで、インクルードの最適化に多くの時間を費やすことなく、ビルド時間を短縮できます。