2012-05-05 37 views
4

私は皆さんがヘッダーの循環依存性が何であるかを知っていると思います。 その結果は、通常、次のようなものです:C++ヘッダーの循環依存関係。見つけ方?

エラー:「MyClassのは」は、この範囲で

を宣言されていないプログラムが短い場合には、何をするかは明らかです。プログラムはファイルの数十を持っている場合 しかし...

私の質問は、「循環依存関係を見つけるためにいくつかのアルゴリズムはありますか?」され 私はいくつかの特定のステップを意味しています。「成功するまでコードを調べる」だけでなく、成功へと導きます。

いくつかのプログラムがありますか?

+0

関連するが実際には重複しない:http://stackoverflow.com/questions/614794/c-c-detecting-superfluous-includes一般に、コンパイルされないプログラムに対して静的解析を実行することは難しい。しかし、私は巨大なコードベースでも検出が困難な循環依存性を発見していません。 – pmr

+0

私の解決策は、ヘッダーに他のファイルを絶対に入れないようにし、実装の.cppファイルに常に必要なヘッダーを含めることです。私は(VSと)一般的なものすべてのための事前にコンパイルされたヘッダーと、私が取り組んでいる特定のプロジェクトのためのすべてのもののための別のヘッダーを持っています。 – Robinson

答えて

0

ドキュメントツールDoxygenは、依存関係を示す図を生成できます。私はこれを使って、異なるライブラリのヘッダファイル間の循環依存関係を示しました。

-1

But if the program has tens of files...

これはまだ短いです。コンパイラエラーメッセージに記載されている行に移動し、ここでクラスが利用可能かどうかを確認してください。 * .cppに問題が発生した場合は、対応するファイルを#includeしてください。ヘッダに問題が発生した場合は、前方宣言(class MyClass;)を追加してください。前方宣言が十分でない場合、#includeファイルにmyclassを宣言します。これが循環依存性を引き起こす場合は、ヘッダあたりの型が多すぎます。いくつかの小さなヘッダーにヘッダーを分割します。これを行う1つの方法は、プログラム全体のヘッダーごとに1つのクラスを持つことですが、多くのシナリオでは、これは過度の作業になる可能性があります。

0

私が知っている少なくとも1つのコンパイラ(Visual C++)には、インクルード順序を追跡するのに役立つ「show includes」というオプションがあります。これは、サイクルがどこで発生するのかを知るのに役立ちます。コンパイラにこのようなオプションがない場合は、#pragma message(または同等のもの)をファイルの先頭に追加してトレースすることができます。

関連する問題