第15回
関数の宣言~ライブラリとヘッダファイル

関数の宣言

関数は宣言しなければ使用できません。ライブラリ内の関数はそれに対応するヘッダファイル内で宣言されていますが、ソース内で独自に定義した関数は、それを呼び出す前に名前と引数の型を明確にする必要があります。

プロトタイプ宣言

ソース中で使用する関数の宣言を「プロトタイプ宣言」と呼び、以下のような書式で記述します。

<関数の型> <関数名>(<引数の型>, <引数の型>...);
<関数の型>は、関数がreturn命令で呼び出し元に返す値の型です。<引数の型>は関数の定義で明示した仮引数の型を、引数の数だけ列挙します。引数名を記述する必要はありません(関数名を記述してもエラーとはなりません)。

関数の実体を定義する場合は、これに続いて{}内に関数の実際の動作をソースコードとして記述しますが、宣言では上記のような形式で名前と引数の型を示した後に;を記述します。

コンパイラに型を知らせる

例えば、以下のような定義をした関数getresultがあるとします。
int getresult(int level, char *name)
{
        :
}
この関数をソース中で呼び出すには、その前に以下のようにして関数のプロトタイプ宣言を行わなければなりません。
int getresult(int, char *);
この1行で、コンパイラは関数"getresult"が『int型とchar *型の2つの引数を採り、処理後にint型の値を返す』ものだと知ります。これによって、もしソースの記述間違いで引数や戻り値の型が異なっていた場合に、コンパイラがエラーメッセージを表示できるようになります。

本コラムの第11回「エラーメッセージと対処方法(1)」で『暗黙のint型』について紹介しましたが、古い処理系では変数だけではなく関数にもこれが適用されました。

ソース中で宣言されていない関数を呼び出すと、その戻り値が暗黙のうちにint型とされ、エラーとならずにコンパイルされてしまう仕様だったのです。現在の主要なコンパイラは、このような場合にはエラーを発します。