関数プロトタイプとは?

関数プロトタイプとは、関数の事前定義です。
これを上手に使うと、ソースファイルをまたいで関数の呼び出しをしたり、呼び出し側の関数よりも下に記載された関数を呼び出すことができます。
では、関数プロトタイプの書き方です。

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

よく見ればわかる通り、関数の宣言部分の書き方と同じです。
違いは最後の「;」です。
関数は、「{}」で括って処理を記述しますが、関数プロトタイプは処理は記述しません。

スポンサーリンク

サンプルプログラム

ソースファイル名:main.c

実行方法

上のソースを書き写して実行してください。

関数を呼び出し元よりも下に書くには?

先にも述べましたが、関数プロトタイプとは、関数の事前定義です。

今まで、関数は、呼び出す側の関数より上に書く必要がありました。
しかし、関数をたくさん使うようになると、どうしても状況によっては、前後関係を維持できない時があります。

そんな時に使うのが、この関数プロトタイプです。
サンプルプログラムの、

int func_A( int a, int b );

が関数プロトタイプになり、

"int 型の戻り値と int 型の引数を二つ持つ add という名前の関数をこのソースファイルのどこかに書く予定です"

という事前定義になります。
これを書いておけば、コンパイラは add がどこかで書かれているとわかるので、add を呼び出し元の関数より下に書いてもエラーを出さなくなります。

ただ、この関数プロトタイプ、使うときにはいくつか注意が必要になります。

関数プロトタイプの注意点

名前、戻り値の型、引数の数と型は関数の実体と合わせる

関数プロトタイプは、事前定義になるので、宣言の内容は実体と合わせる必要があります。
名前はもちろんのこと、戻り値の型、引数の数と型まで合わせる必要があります。

int add( int a, int b );

赤字で書かれたは実態と合わせる必要があります。
これが間違っているとプロトタイプとして成り立ちませんのでエラーが出るので注意してください。

引数の名前は必要ない

関数プロトタイプを使用するとき、引数の名前は特に必要ありません。
サンプルプログラムの

int add( int, int );

と記載することもできます。
また、引数の名前が違っていても問題ありません。
サンプルプログラムの関数プロトタイプの部分を

int func_A( int arg1, int arg2 );

として、実体の引数名と異なる名前にしてもエラーになりませんし、問題なく動作します。

関数の実体と呼び出し元よりも前に記載する

関数プロトタイプは、関数の実体や呼び出し元の関数よりも前に記載する必要があります。
サンプルプログラムなら、main() や、add() よりも前に記載しましょう。

一般的には、ソースファイルの一番前(#include文の次 )に書きます。
ここに書いておけばまず問題ないと思います。

スポンサーリンク