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");
}

処理の流れをイメージすると

このプログラムの流れは、次のようになります。

  1. main関数が実行される
  2. startTask関数が呼び出される
  3. startTaskの中で detailTask が呼び出される
  4. detailTaskが処理を終える。
  5. startTaskに戻る
  6. mainに戻る

プロトタイプ宣言があるおかげで、

  • main
  • startTask
  • detailTask

という 読みやすい順番
コードを並べられるようになっています。

プロトタイプ宣言が書かれている位置の意味

プロトタイプ宣言には、
とても重要な性質があります。

プロトタイプ宣言より後ろのコードで、
その関数が使えるようになる

という点です。

そのため、一般的には

  • include文の下
  • main関数の前

にまとめて書かれることが多くなります。

この配置により、

  • まず「どんな関数があるか」が分かる
  • 次に「main関数の流れ」を読める

という、
非常に見通しのよい構造になります。

プロトタイプ宣言は業務では必須級

個人学習では、

  • 関数定義を上に並べる
  • プロトタイプ宣言を使わない

という書き方でも問題ありません。

しかし、業務開発では、

  • ファイル分割
  • 大量の関数
  • チーム開発

が当たり前になります。

その世界では、
プロトタイプ宣言はほぼ必須の技術 です。

「関数の存在を先に知らせる」という考え方は、
このあと学ぶヘッダファイルにも
そのままつながっていきます。

まとめ:プロトタイプ宣言は「先に名刺を渡す」

この節のポイントを整理しましょう。

ポイント内容
目的関数の存在を先に伝える
書き方関数定義の1行目 + セミコロン
効果定義より前でも呼び出せる
メリット実行順に読みやすいコードになる

プロトタイプ宣言は、
関数が登場する前に渡す 名刺 のようなものです。

「この関数は、あとでちゃんと登場しますよ」

と先に伝えることで、
人にもコンパイラにも優しいコードが書けるようになります。

次は、
引数や戻り値を持つ関数とプロトタイプ宣言の関係
を見ていきましょう 😊