C/C++ 言語で開発する際のプロジェクトのディレクトリ構成
ディレクトリ構成で迷っている人をTwitterで見かけたので、我流であるが、何かの参考になれば。
よく見かけるディレクトリ構成を2つ挙げる
プロジェクトトップディレクトリ以下にヘッダ(*.h)、ソース(*.c)別にディレクトリを作る
その下に機能別に分類されていることも
src等の名前のディレクトリ以下にとりあえずヘッダ/ソースが一緒に並んでいる
機能別にサブディレクトリを構成して、ヘッダ/ソースをセットにしてまとめていることも
個人的には圧倒的に後者を勧めたい。
自分は特に組み込み系開発をするため、
たくさんのデバイス(ハードウェア)ドライバ(ライブラリ)
いくつかのデータ処理ライブラリとタスク管理
一つのmainソース
という構成になることが多い。なので、この3,4つで分けることが多い。
特に、デバイスドライバは再利用することが多々ある。
デバイスドライバはほとんどすべて、以下の構成である。
ソースファイル
デバイス制御実体
ヘッダファイル
デバイス制御関数リスト、構造体等の定義
レジスタマップヘッダファイル
#define文でアドレスやビットマスク、シフト量が羅列されているファイル
これらのファイルをセットで管理したいために、冒頭で触れた後者のパターンが有用である。
(逆に前者で管理したらバラバラになる事が容易に想像つくと思われる)
他で同じデバイスを使う場合、ディレクトリごとコピーしてやるなり、ディレクトリ単位でバージョン管理してやれば再利用がラクになる。
同じようなインターフェースを扱う場合など、抽象クラスを書くこともあるが、その場合は抽象クラスのソース/ヘッダの入ったディレクトリを作り、その下に適宜そのクラスの実体クラスを置くなどすればソースコードを見ずともコードの動きや関連性が見えてくる。
なお、「ディレクトリ分類すると#includeが面倒」などという輩がいるが、ヘッダファイルまでのパスを含めて#includeに書こうとするから問題なのであり、Makefileを書くなりIDEを適切に設定してインクルードパスを通せばまったく問題ない(結果としてMakefileの記述と等価だが)。
もっと良い方法や、アイデアがあればぜひ教えていただきたいです。