関数宣言

関数はどこからでも呼び出すことができますが、必ず呼び出し元よりも前の位置に宣言または定義されていなければなりません。次のように func()関数の定義がmain()関数よりも後ろにある場合、main()関数からfunc()関数を呼び出すことはできません。

int main(void)
{
    func();
    ...
}

void func(void)
{
    ...
}

上記のようなコードの場合、main()関数がコンパイラによって処理された時点でfunc()関数が認識されていませんこの問題を解決するには、関数を事前に宣言しておきます。関数宣言は、関数本体となる複合文を省略した形式で、セミコロンで終わります。

戻り値型 関数名 ( 仮パラメータリスト ) ;

上記のような関数宣言は、コンパイラに指定した関数を予約する役割を持ちます。これによって、コンパイラは事前に関数を認識することができます。プログラミングの世界では、宣言と定義という表現が使い分けられています。一般に宣言と言えば実体を持たずに性質(型)だけを記したものを表し、定義と言えば記憶領域に割り当てられる実体をもったものを表します。関数宣言は実体をもちませんが、事前にコンパイラに対して関数を登録できます。複数のファイルで関数を共有して利用する場合などは、必ず必要になります。

サンプル05

#include <stdio.h>

void func(void);

int main(void)
{
    func();
    return 0;
}

void func(void)
{
    printf("func() 関数が呼び出されました\n");
}

実行結果

サンプル05の実行結果

サンプル05は、main()メソッドの後に定義しているfunc()関数をmain()メソッドから呼び出すために、func()関数を事前に宣言しています。関数宣言は関数を使用するよりも前に指定されなければなりません。

上記の例は、学習用に同じファイル内に関数の宣言と定義を書いていますが、通常はヘッダファイルと呼ばれるソースファイルとは別のファイル内で宣言します。ヘッダファイルは、拡張子が h のテキストファイルです。これまで、ソースの先頭で#include <stdio.h>と書いてきましたが、これはソースファイルにstdio.hというヘッダファイルを埋め込みなさいという事前処理を指定しています。stdio.h にはprintf()関数など入出力に関する標準関数を使うための宣言が書かれているという仕組みです。