2009-06-07 10 views
4

古典的な 'ゴードンノット'の状況に苦しんでいる.hファイルのセットがある場合、あなたは何をしますか?#include 1には、ほとんどすべてのロットを含むことになりますか?予防は明らかに最良の薬ですが、ベンダー(!)がライブラリを出荷する前にこれが起こったときはどうしますか?unangling .h dependencies

ここに質問の拡張があります。これはおそらくより適切な質問です。あなたは最初のところで依存関係を解消しようとしますか?

+0

+1私も同様の問題があります。 – Naveen

答えて

4

これは、既に多くのライブラリに分割されていたC++コードベースで行いました(これは良いスタートでした)。

私は、どのライブラリが最も依存していたかを推測(または推測)しなければなりませんでした。これは、コードベースの他には何も依存しませんでした。その後、各ライブラリを順番に処理しました。

私は各モジュール(* .cppファイル)を順番に調べ、最初に独自のヘッダーが#​​includeされ、残りがコメントアウトされていることを確認してから、そのヘッダーファイルのすべての#includeをコメントアウトしてから、そのモジュールだけをコンパイルして、コンパイラに必要なことを教えさせました。私は必要と思われる最初のヘッダーをコメント解除し、必要に応じてそのヘッダーを再検討しました。いくつのヘッダーが必要なくなったのかを知ることは面白かったです。

class name;またはstruct name;を使用してください(ポインタまたは参照があるため)。これは前方宣言と呼ばれ、ヘッダーファイルを#含むことを避けます。

コンパイラは、#includeをコメントアウトするときに依存関係が何であるかを伝えるのに非常に役立ちます(移植性を維持する必要があるすべてのコンパイラで再コンパイルする必要があります)。

ライブラリ間でモジュールを移動して、ライブラリのペアやグループが相互に依存しないようにしなければならないことがありました。

+0

ヘッダーの前方宣言は+1、実装ファイルは完全にインクルードされています。 – CiscoIPPhone

1

あなたには機会がありますが、大きすぎるインクルードを減らすためにコードをリファクタリングする必要がありますが、パッケージの結束を達成できると想定しています。とにかくコードのすべてのユーザーがすべての要素を含む必要があることを発見しただけでは、結果は同じになります。

また、#definesを使用してセクションのオン/オフを設定することもできます。それにもかかわらず、既存のコードベースでは、ソリューションはパッケージの結束に向かって移動します。

Read:http://ivanov.files.wordpress.com/2007/02/sedpackages.pdfとパッケージの結束に関連する研究の問題。

1

私は結び目を数回解きましたが、システムを維持してできるだけ多くの.h依存関係を減らすためには、一般的に多くの助けになります。依存関係ツリーを生成するための適切なツールがあります(私はその時点でKlocworkを使用していました)。

私が見つけた欠点は、条件付きコンパイルによるものでした。誰かがヘッダーファイルを削除する可能性があるので、必要ないと思うので、VxWorksにはヘッダーがいくつかあります.Solaris(または合理的なPosixシステム)で、それ。

0

膨大な数の細かく整理されたヘッダーと、すべてが含まれる単一のヘッダーの間に打ち間違いがありません。標準Cライブラリについて考えてみましょう。 <stdio.h>のようないくつかの大きなヘッダーがありますが、多くの機能が宣言されていますが、それらはすべてI/Oに関連しています。雑誌のほうが多い他のヘッダー、特に<stdlib.h>があります。

Cのゴダード宇宙飛行センターガイドラインは、狩りに値するものです。

基本規則は、各ヘッダーが適切な(通常は小さな)ソースファイルセットによって提供される機能を宣言することです。施設とヘッダーは自己完結型でなければなりません。つまり、誰かがヘッダ"something.h"のコードを必要とする場合は、コンパイルに追加する必要がある唯一のヘッダである必要があります。 "something.h"が必要とする施設がヘッダーで宣言されていない場合は、関連するヘッダーを含める必要があります。これは、例えば、関数の1つがsize_tを使用するため、ヘッダが<stddef.h>を含むことを意味します。

@quamranaが指摘しているように、適切な場合に質問がタグ付きCであるため、構造体(クラスではない)の前方宣言を使用できます。これは、主にインターフェイスがポインタをとり、サイズを知る必要がない構造物または部材のいずれかのものである。