
C言語入門|関数の存在を先に知らせるプロトタイプ宣言
関数をいくつか作って、
関数どうしを呼び出すようになってくると、
多くの人が同じところで立ち止まります。
「main関数を一番上に書きたいのに、
呼び出す関数を先に定義しないとエラーになる……」
ありますよね、このモヤモヤ。
プログラムを 実行される順に読みたい のに、
書く順番に制限がある のは、ちょっと不自由に感じます。
この悩みをスッと解決してくれるのが、
今回のテーマである プロトタイプ宣言 です。

なぜ関数の順番が問題になるのか
まず、C言語の大切なルールを思い出しましょう。
関数は、定義された行より後ろでしか呼び出せない
このルールがあるため、次のような構造はエラーになります。
int main(void)
{
process();
return 0;
}
void process(void)
{
printf("処理を実行します\n");
}人間から見ると意味は明らかですが、
コンパイラは上から順にコードを読むため、
「process という関数は知らない」
と判断してしまうのです。
実行順で書きたい、という自然な欲求
実際のプログラムは、
- main関数が入口
- そこから処理が枝分かれする
という流れになっています。
そのため、
- 最初に main
- 次に main から呼ばれる関数
- さらにその中で使われる関数
という順番で書けたほうが、
読む人にとって圧倒的にわかりやすい のです。
この「人間の感覚」と
「コンパイラの都合」のズレを埋める仕組みが、
プロトタイプ宣言です。
プロトタイプ宣言とは何か
プロトタイプ宣言とは、
関数の中身を書く前に、存在だけを先に伝える宣言 です。
基本形は次のとおりです。
戻り値の型 関数名(引数リスト);これは、
関数定義の1行目と同じ内容に、
セミコロンを付けただけの形になっています。
プロトタイプ宣言で何が起きているのか
プロトタイプ宣言を書くと、
コンパイラに次のように伝えていることになります。
「このあとで、この名前・この形の関数が登場します」
つまり、
- 中身はまだ見せない。
- でも存在することは保証する。
という 約束 をしているのです。
そのため、
関数の定義が後ろにあっても、
呼び出しが許されるようになります。
プロトタイプ宣言を使った例
では、プロトタイプ宣言を使って、
少し構造を整理したサンプルを見てみましょう。
表示するメッセージは、参考例とは別の内容にしています。
プロジェクト名:8-5-1 ソースファイル名: sample8-5-1.c
#include <stdio.h>
void startTask(void);
void detailTask(void);
int main(void)
{
startTask();
return 0;
}
void startTask(void)
{
printf("処理を開始します\n");
detailTask();
}
void detailTask(void)
{
printf("詳細な処理を実行中です\n");
}処理の流れをイメージすると
このプログラムの流れは、次のようになります。
- main関数が実行される
- startTask関数が呼び出される
- startTaskの中で detailTask が呼び出される
- detailTaskが処理を終える。
- startTaskに戻る
- mainに戻る
プロトタイプ宣言があるおかげで、
- main
- startTask
- detailTask
という 読みやすい順番 で
コードを並べられるようになっています。
プロトタイプ宣言が書かれている位置の意味
プロトタイプ宣言には、
とても重要な性質があります。
プロトタイプ宣言より後ろのコードで、
その関数が使えるようになる
という点です。
そのため、一般的には
- include文の下
- main関数の前
にまとめて書かれることが多くなります。
この配置により、
- まず「どんな関数があるか」が分かる
- 次に「main関数の流れ」を読める
という、
非常に見通しのよい構造になります。
プロトタイプ宣言は業務では必須級
個人学習では、
- 関数定義を上に並べる
- プロトタイプ宣言を使わない
という書き方でも問題ありません。
しかし、業務開発では、
- ファイル分割
- 大量の関数
- チーム開発
が当たり前になります。
その世界では、
プロトタイプ宣言はほぼ必須の技術 です。
「関数の存在を先に知らせる」という考え方は、
このあと学ぶヘッダファイルにも
そのままつながっていきます。
まとめ:プロトタイプ宣言は「先に名刺を渡す」
この節のポイントを整理しましょう。
| ポイント | 内容 |
|---|---|
| 目的 | 関数の存在を先に伝える |
| 書き方 | 関数定義の1行目 + セミコロン |
| 効果 | 定義より前でも呼び出せる |
| メリット | 実行順に読みやすいコードになる |
プロトタイプ宣言は、
関数が登場する前に渡す 名刺 のようなものです。
「この関数は、あとでちゃんと登場しますよ」
と先に伝えることで、
人にもコンパイラにも優しいコードが書けるようになります。
次は、
引数や戻り値を持つ関数とプロトタイプ宣言の関係
を見ていきましょう 😊
