関数のプロトタイプ宣言 †
関数のプロトタイプ宣言は、関数の宣言です。 戻り値の型、関数名、引数の型、引数名を宣言します。
戻り値の型 関数名(引数1の型 引数1の名前, 引数2の型 引数2の名前, ...);
関数を使う前に、プロトタイプ宣言が必要です。
void inc(int i); // プロトタイプ宣言 int main(void) { int i = 0; inc(i); // 変数を渡す printf("%d\n", i); return 0; } /* * 受け取った引数の値を1増やして出力する(関数定義) */ void inc(int i) {{ i++; printf(">> %d\n", i) }
プロトタイプ宣言を省略できる場合 †
以下の二つの場合には、プロトタイプ宣言を省略することができます。
関数定義 †
関数定義はプロトタイプ宣言を兼ねています。
したがって、使用されるよりも前に関数が定義されている場合は、プロトタイプ宣言を省略できます。
これまでプロトタイプ宣言がなくても問題がなかったのは、このためです。
関数の戻り値がint型 †
プロトタイプ宣言がないと、戻り値はint型であると仮定してコンパイルを進めます。
関数定義において戻り値がint型でないと、コンパイル時にエラーが発生します。
プロトタイプ宣言における変数の有効範囲 †
関数のプロトタイプ宣言の引数として宣言した変数は、プロトタイプ宣言の中だけで有効です。
プロトタイプ宣言の引数の名前は、その関数の定義における引数の名前と同じである必要はありません。 引数名を省略することもできます。
ただし、引数の型は定義と同じでないといけません。
まとめ †
関数を使うには、事前にプロトタイプ宣言が必要です。
プロトタイプ宣言では、戻り値の型、関数名、引数の数とそれぞれの型を宣言します。
関数の定義は、プロトタイプ宣言の代わりになるので、関数が定義してある場合はプロトタイプ宣言を省略できます。
また、プロトタイプ宣言がない場合は戻り値がint型の関数と仮定されるため、戻り値がint型の関数はプロトタイプ宣言を省略できますが、省略せずにきちんと宣言しましょう。
練習問題 †
練習問題はこちら。