ヘッダーファイルとソースファイル
宣言とコードを分離します。
「ヘッダーファイルとソースファイル」はCoddyKit上の無料C Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C Academyコースには全4レッスンが含まれています。
なぜコードをファイルに分割するのか
Cプログラムが大きくなると、すべてを1つの.cファイルに置くのは読みにくく、コンパイルにも時間がかかるようになります。
Cでは、プロジェクトを複数のファイルに分割できます。それぞれのファイルが1つの役割を担当します。これにより整理しやすくなり、コードを再利用でき、1か所を変更してもすべてを再コンパイルする必要がなくなります。
2種類のファイル
モジュール化されたCプロジェクトでは、2種類のファイルを使います。
ソースファイル(.c)には、関数本体や定義など、実際の実装を記述します。
ヘッダーファイル(.h)には、関数プロトタイプ、型定義、他のファイルが知る必要のあるマクロなどの宣言を記述します。
ヘッダーファイル
ヘッダーは、どのように動作するかを示さずに、何が存在するかを宣言します。
ここでは、math_utils.hがadd関数を宣言しています。このヘッダーをインクルードするファイルは、関数のシグネチャを知ることができ、その関数を呼び出せます。
/* math_utils.h */
int add(int a, int b);対応するソースファイル
ソースファイルには実装を記述します。コンパイラが定義と宣言の一致を確認できるように、自分自身に対応するヘッダーをインクルードします。
ヘッダーが引用符で囲まれていることに注目してください。これは自分のプロジェクトのファイルに使います。
/* math_utils.c */
#include "math_utils.h"
int add(int a, int b) {
return a + b;
}モジュールを使う
ここでmain.cはヘッダーをインクルードし、addを呼び出します。関数本体を見ることはなく、プロトタイプだけを参照します。
コンパイラは宣言を信頼し、後でリンカーが呼び出しをmath_utils.c内の実際の実装に結び付けます。
/* main.c */
#include <stdio.h>
#include "math_utils.h"
int main(void) {
printf("%d\n", add(2, 3));
return 0;
}引用符と山括弧の違い
#includeディレクティブには2つの形式があります。
#include <stdio.h>は、システムや標準ライブラリのヘッダーに山括弧を使います。コンパイラは標準のインクルードパスを検索します。
#include "math_utils.h"は、自分で作成したヘッダーに引用符を使い、まず現在のディレクトリを検索します。
#include <stdio.h> /* standard library */
#include "math_utils.h" /* your project */ヘッダーに記述する内容
ヘッダーには宣言を記述し、定義は記述しないでください。
ヘッダーに適している内容は、関数プロトタイプ、structとtypedefの宣言、#defineマクロ、extern変数宣言です。
関数本体や変数定義を置くと、シンボルの重複エラーが発生することがあるため避けてください。
/* shapes.h */
typedef struct {
double width;
double height;
} Rect;
double rect_area(Rect r);ソースファイルに記述する内容
ソースファイルには、関数定義やファイル専用のヘルパーなど、実際の処理を記述します。
コンパイラがシグネチャの一致を検証できるように、対応するヘッダーをインクルードします。これにより、リンク時ではなく早い段階で不一致を検出できます。
/* shapes.c */
#include "shapes.h"
double rect_area(Rect r) {
return r.width * r.height;
}宣言と定義
この違いは、モジュール化されたCの中心的な概念です。
宣言は、名前の型とシグネチャをコンパイラに伝え、使用できるようにします。int add(int, int);
定義は、記憶領域を確保したり本体を提供したりして、実際の実体を作成します。ヘッダーでは宣言し、ソースファイルでは定義します。
int add(int a, int b); /* declaration */
int add(int a, int b) { /* definition */
return a + b;
}命名規則
よくあるパターンでは、各モジュールを名前で対応付けます。logger.hとlogger.c、parser.hとparser.cのようにします。
これにより、実装がどこにあるかがすぐ分かります。関連する関数を1つのモジュールにまとめ、各ファイルが明確に1つの役割を持つようにします。
/* logger.h */
void log_info(const char *msg);
void log_error(const char *msg);ビルドの全体像
各.cファイルは独立してコンパイルされてオブジェクトファイルになり、その後、すべてのオブジェクトファイルがリンクされて1つのプログラムになります。
ヘッダー自体が単独でコンパイルされることはありません。ヘッダーをインクルードするソースファイルに、テキストとして挿入されます。ビルド全体の流れは、後のレッスンで詳しく説明します。
gcc -c main.c /* -> main.o */
gcc -c math_utils.c /* -> math_utils.o */
gcc main.o math_utils.o -o app理解度チェック
ヘッダーとソースファイルの役割について、理解度を確認しましょう。
まとめ
Cプロジェクトを.hヘッダーと.cソースファイルに分割する方法を学びました。
ヘッダーでは存在するものを宣言し、ソースファイルではその動作を定義します。自分のヘッダーには引用符を、標準ヘッダーには山括弧を使います。
次は、ヘッダーを複数回インクルードすることで起こる問題を防ぎます。
よくある質問
「ヘッダーファイルとソースファイル」レッスンは無料ですか?
はい。「ヘッダーファイルとソースファイル」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C Academyコースには全4レッスンが含まれています。
「ヘッダーファイルとソースファイル」で何を学びますか?
宣言とコードを分離します。 ブラウザで直接実行するハンズオンコードでC Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「ヘッダーファイルとソースファイル」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC Academyレッスンでコードを書いて実行できますか?
はい。すべてのC Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- ヘッダーファイルとソースファイル
- インクルードガード
- externとリンケージ
- 複数ファイルをコンパイルする