分割コンパイル: チーム開発の基本

ファイルを分けることで、大規模な開発が可能になる。「宣言」と「定義」の違いを理解する。

リンク (Linking)
複数のオブジェクトファイル(.o)を結合して、一つの実行ファイルを作ること。
宣言 (Declaration)
「こういう関数があります」とコンパイラに伝えること。ヘッダファイルに書く。
定義 (Definition)
関数の本体(中身)を書くこと。ソースファイル(.c)に書く。
車の組み立てライン (Car Assembly Line)

分割コンパイルは「車の組み立て」です。 `main.c` は車体を作る工場、`math_utils.c` はエンジンを作る工場です。 お互いの工場は独立していますが、車体工場はエンジンのサイズや接続口を知らないと困ります。その「設計図(仕様書)」がヘッダファイル (`math_utils.h`) です。 最後に、それぞれの工場で作った部品(オブジェクトファイル `.o`)を結合(リンク)して、一台の車(実行ファイル)を完成させます。

巨大なファイルを分割する

数千行のコードを main.c 一つに書くのはナンセンスです。機能ごとにファイルを分け、それぞれを独立して開発・コンパイルできるようにします。

基本ルールは以下の通りです:

  • ヘッダファイル (.h): インターフェース。「どんな関数が使えるか」のカタログ。
  • ソースファイル (.c): 実装。「実際に何をするか」の中身。

コードの書き方

math_utils.h
// math_utils.h (宣言)
#pragma once
int add(int a, int b);
math_utils.c
// math_utils.c (実装)
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}
main.c
// main.c (利用)
#include <stdio.h>
#include "math_utils.h"
int main() {
printf("%d\n", add(1, 2));
return 0;
}

コンパイルの流れ

ファイルを分割したら、それぞれの `.c` をコンパイルして `.o` (オブジェクトファイル) を作り、最後にそれらを結合(リンク)します。

Terminal
# コンパイル方法
gcc -c main.c # main.o ができる
gcc -c math_utils.c # math_utils.o ができる
# リンク (結合)
gcc main.o math_utils.o -o my_app

演習課題

課題1: 3ファイル構成
上の例を実際に作成し、コマンドラインでコンパイル・実行してみてください。

合格ライン

.hと.cの役割の違いを説明できる
複数のファイルをリンクして実行ファイルを作れる