C言語

関数の宣言

関数の基本的な仕組み」で、関数の基本的な仕組みは説明しましたね。
今回は、関数を使うときに必要になる 「関数の宣言」 について解説します。

関数について

関数は、本来、「定義(中身の書かれた本体)」と「宣言(使うことを知らせる)」の2つの部分で構成されます。
今までは、「定義(中身の書かれた本体)」を扱ってきました。

でも、ここで少し疑問に思いませんか?
「いままで関数宣言なんて書いていなかったのに、ちゃんと動いていた!」
ということです。

例えば、次のようなプログラムを見てください。

#include <stdio.h>

int add(int a, int b)  // ← 関数を先に定義している
{
    return a + b;
}

int main(void)
{
    int sum;

    sum = add(3, 5);   // 定義済みなので使える
    printf("%d\n", sum);

    return 0;
}

このように、「関数を使う場所(main関数)」よりも上に関数の定義を書いている場合は、宣言を省略しても問題ありません。
なぜなら、コンパイラは上から順に読んでいくため、すでに関数の内容を知っているからです。

では、関数が後ろにあるとどうなるのでしょうか?

もし関数が下に書かれていたら、次のようになります。

#include <stdio.h>

int main(void)
{
    int sum;

    sum = add(3, 5);   // ← まだ出てきていない関数
    printf("%d\n", sum);

    return 0;
}

int add(int a, int b)
{
    return a + b;
}

この場合、コンパイラは「addという関数が何なのか分からない」となってしまい、コンパイルエラーになります。
こういうときに登場するのが 関数宣言 です。

関数宣言とは

関数宣言(プロトタイプ宣言)とは、「このあとに、こういう関数が登場しますよ」とコンパイラに知らせるための予告文です。

関数宣言の構文は次の通りです。

戻り値の型 関数名(引数の型 引数名, 引数の型 引数名);

関数定義の書き方と同じですが、
最後にセミコロン( ; )が必要になります。

#include <stdio.h>

int add(int a, int b);   // ← 関数宣言

int main(void)
{
    int sum;

    sum = add(3, 5);     // 先に宣言されているので使える
    printf("%d\n", sum);

    return 0;
}

int add(int a, int b)
{
    return a + b;
}

このように、関数宣言(プロトタイプ宣言)をすることで、関数定義をする前に関数を使用することができます。

まとめ

  • 関数は、使う前に「宣言」または「定義」が必要
  • 先に定義していれば、宣言は不要
  • 後で定義する場合は、「宣言(プロトタイプ)」を書く
  • 宣言は「戻り値の型 関数名(引数...);」の形式
  • 最後のセミコロンを忘れない


-C言語