【6日でできるC言語入門】ソースコード分割の原則

 C言語でプログラムを作成する際、規模が大きくなればなるほど、ソースコードの分割は避けて通れません。適切なファイル分割を行うことで、見通しの良さ・保守性・再利用性が向上し、チーム開発にも対応しやすくなります。しかし、どこに何を書くべきかというルールがなければ、コードの管理が煩雑になり、バグの温床になってしまいます。
ここでは「ソースコード分割の原則」を解説し、実例と共に分割方法をわかりやすく整理します。

1.ヘッダーファイルとソースファイルの役割

1.1. ヘッダーファイルに記述する内容

 ヘッダーファイル(.hファイル)は複数のファイル間で共有する情報をまとめておくためのものです。主に、外部公開したい型や関数などを記述します。

記述する情報解説
① ヘッダーファイルのインクルード必要な他のヘッダーファイル(例: <stdio.h>)のインクルード
② マクロの定義外部と共有する定数や便利マクロの定義
③ 列挙型の定義外部で利用するenum型の定義
④ 構造体の定義外部と共有したいstruct型の定義
⑤ 関数のプロトタイプ宣言外部と共有したい関数のプロトタイプ宣言

例: ヘッダーファイル book.h

プロジェクト/ファイル名: Lesson70_1/book.h

#ifndef _BOOK_H_
#define _BOOK_H_

#include <stdio.h>
#define MAX_TITLE 100

typedef struct {
    int id;
    char title[MAX_TITLE];
} Book;

void printBook(const Book*);
Book createBook(int, const char*);

#endif

1.2. ソースファイルに記述する内容

 ソースファイル(.cファイル)は**実際の処理の中身(ロジック)**を書く場所です。また、内部だけで使う定数や変数、関数もここで定義します。

記述する情報解説
① ヘッダーファイルのインクルード対応するヘッダーファイル、自分が使う標準ヘッダファイルをインクルード
② マクロの定義内部専用の定数やマクロ。ヘッダに書かない
③ 列挙型の定義内部専用のenum型。外部に不要な場合のみここに書く
④ 構造体の定義内部専用のstruct型。外部に不要な場合のみここに書く
⑤ グローバル変数(非static)externで外部と共有するためのグローバル変数
⑥ グローバル変数(static)外部ファイルからアクセスできない内部専用グローバル変数
⑦ 関数のプロトタイプ宣言ファイル内でのみ使うstatic関数のプロトタイプ宣言
⑧ 関数の定義ヘッダファイルや⑦で宣言された関数の実体

例: ソースファイル book.c

プロジェクト/ファイル名: Lesson70_1/book.c

#include "book.h"
#include <string.h>

static int book_counter = 0; // ファイル内限定のグローバル変数

Book createBook(int id, const char* title) {
    Book b;
    b.id = id;
    strncpy(b.title, title, MAX_TITLE - 1);
    b.title[MAX_TITLE - 1] = '\0';
    book_counter++;
    return b;
}

void printBook(const Book* b) {
    printf("書籍ID: %d, タイトル: %s\n", b->id, b->title);
}

2.ファイル分割の原則と実践ポイント

2.1. ヘッダーファイル分割のコツ

  • 他ファイルと共有したい情報だけ書く。
  • インクルードガード(#ifndef ... #endif)を必ず書く。
  • 構造体・列挙体・マクロ・関数プロトタイプのみ

2.2. ソースファイル分割のコツ

  • ファイル内のみで使うものはstaticをつけて隠す。
  • 必要に応じてexternで外部変数を共有
  • ロジックや関数の中身は.cに書く。

3.サンプル:ソース分割の実例

3.1. main.c

プロジェクト/ファイル名: Lesson70_1/main.c

#include "book.h"

int main(void) {
    Book b = createBook(1, "C言語プログラミング");
    printBook(&b);
    return 0;
}

実行結果

1.「SDLチェック」を「いいえ」にします。

2.メニューの「ビルド」から「ソリューションのビルド」を実行します。

3.プログラムを実行します。

書籍ID: 1, タイトル: C言語プログラミング

4.補足事項・注意点

  • 同じ定義をヘッダとソース両方に書かないこと
  • 外部公開しないものは極力staticで隠すこと
  • ヘッダファイルの循環参照に注意すること
  • インクルードする順番を一定にすること

まとめ

 ソースコード分割の原則は「共有すべきものはヘッダ、実装はソース、内部専用はstaticで隠す」というシンプルなものです。
複雑なプロジェクトほどこのルールを徹底することで、保守性・見通し・再利用性が大きく向上します。
設計段階から分割方針を決めて、適切なファイル管理を心がけましょう。