web-dev-qa-db-ja.com

Cプロジェクトのフォルダー構造

Cプロジェクトに推奨されるフォルダー構造は何でしょうか。 src、include、test、buildフォルダーの使用に関するいくつかの投稿を読みました。しかし、プロジェクトをモジュールで構成したい場合はどうなりますか?

次のような構造を使用する必要があります:

src/
    core/
        main.c
        sysinit.c
        interrupts.c
        ...
    module1/
        file1_1.c
        ...
    module2/
        file2_1.c
        ...

include/
    core/
        main.h
        sysinit.h
        interrupts.h
        ...
    module1/
        file1_1.h
        ...
    module2/
        file2_1.h
        ...

またはこのように:

core/
    src/
        main.c
        sysinit.c
        interrupts.c
    include/
        main.h
        sysinit.h
        interrupts.h
        ...
module1/
    src/
        file1_1.c
        ...
    include/
        file1_1.h
        ...
module2/
    src/
        file2_1.c
        ...
    include/
        file2_1.h
        ...

前の2つのパターンが推奨されない場合、どのような規則/一般的に使用されるパターンですか?

3
Mat.R

どちらも可能であるため、一方のアプローチを使用するのではなく、何らかの理由を見つけた場合は、先に進んでください。

異なるモジュール自体がいくらか有用である場合は、2番目のアプローチ(トップレベルのディレクトリはcore、module1、module2など)を使用します(他のすべてのモジュールがそれに依存している場合は「コア」モジュールを除く)。

すべてのモジュールが相互に依存しており、個々のモジュールが他のモジュールなしでは役に立たない場合は、最初のアプローチを使用します(最上位ディレクトリはsrc、includeなどです)。

例1:

小さなオフラインの顧客関係管理(CRM)システム用の4つのモジュールがあります。

  • 「インフラストラクチャ」-ロギング、基本データ型、およびプラットフォームの依存関係を抽象化するいくつかの関数が含まれています
  • 「ドメイン」-ビジネスロジックが含まれています
  • 「gui」-guiが含まれ、「インフラストラクチャ」と「ドメイン」の上に構築されます
  • 「cli」-コマンドラインインターフェースが含まれ、「インフラストラクチャ」と「ドメイン」に基づいて構築されています。

この場合、私は最初のアプローチを使用します(最上位ディレクトリはsrc、includeなどです)。異なる部分を実際に個別に使用することはできません。それらはすべて接続されています。おそらく「インフラストラクチャ」フォルダは他のフォルダなしでコンパイルされますが、結果のライブラリをどのように使用できますか?

例2:

任意のファイルを読み取り、それらを一般的な形式に変換するドキュメント管理システム用の5つのモジュールがあります。

  • base-基本的なデータ型とプラットフォームサポートが含まれています
  • スプレッドシート-Excelおよびopenofficeスプレッドシートの解析を可能にします
  • pdfparser-PDFおよびPSファイルを読み取ることができます
  • imagescanner-JPG、PNG、TIFFファイルを読み取ってOCRを実行します
  • conversiontools-90の異なるファイル形式をより一般的なサポートされているファイル形式に変換できます

この場合、私は2番目のアプローチを使用します(トップレベルのディレクトリはcore、module1、module2などです)-すべてのモジュールはスタンドアロンで使用でき、便利です(「ベース」モジュールを除いて、明らかに)。分離し、それらを別々のディレクトリに配置することで、これが基本的な設計上の決定であることをすべての人に明確に伝えます。


例を作るときは、本当に現実的な例を作るのがいいです。これにより、答えがはるかに明確になります。しかし、悪い例はとても一般的です。実際のプロジェクトには、「module1」および「module2」という名前のモジュールはありません。モジュールが何であるかを知らなければ、アプローチ1またはアプローチ2のどちらが優れているかを知ることはできません。

3
Michael