今回のC言語超入門は「プロトタイプ宣言」についてです。
出来る限り分かりやすく、プロトタイプ宣言の必要性と記述方法についてご説明いたしますね。
プロトタイプ宣言の必要性とは
プロトタイプ宣言とは、関数の名前や引数の数や引数のデータ型など、関数のインターフェース情報を定義したものです。
プロトタイプ宣言をすることで、関数の引数などの記述に誤りがあった場合に、コンパイル時にコンパイラーがエラーメッセージとして通知をしてくれます。
もしプロトタイプ宣言がありませんと、コンパイラーには、関数の正しい引数の数やデータ型が分かりません。
そのためコンパイラーは、関数の戻り値はint型であると仮定して処理を進めてしまいますし、関数の引数に至っては、コンパイラーはチェックを省略してしまうのです。
つまり、たとえ関数の記述が間違っていたとしても、コンパイラーのエラーチェックをすり抜けて、プログラムを実行できてしまうのです。
ここで一つ例を挙げましょう。「※プログラム1」を見てください。
※プログラム1 main() { printf("1 + 2 の答えは %d です。\n", f(1)); } f(int x, int y) { return x + y; }
「※プログラム1」は、関数 f を使用して 1 + 2 の計算結果を出力するプログラムです。
早速「※プログラム1」をコンパイルしてみましょう。コンパイルエラーは出ませんね。では、プログラムを実行してみましょう。
※プログラム1の実行結果
1 + 2 の答えは 1999298681 です。
あれっ、期待通りの結果になりませんね。
コンパイルは正常に終了しているにもかかわらず、なぜ実行結果が正しくないのでしょうか。
もう一度、「※プログラム1」をよく見てください。関数 f には2つの数値を引数として渡す必要があるにもかかわらず、1つしか渡していませんね。これが、プログラムが正しく動作しなかった原因です。
このように、明らかにプログラムの誤りがあるにもかかわらず、コンパイラーはエラーを検出することができないのです。
では正しいプログラムに修正して、改めて実行してみましょう。(※プログラム2)
※プログラム2 main() { printf("1 + 2 の答えは %d です。\n", f(1, 2)); } f(int x, int y) { return x + y; }
※プログラム2の実行結果
1 + 2 の答えは 3 です。
今度は期待通りの実行結果になりましたね。
今回は非常に簡単なプログラムのため、目視でもプログラムのミスを短時間で発見することができましたが、プログラムの規模が大きくなるに比例して、このようなプログラムのミスを発見するために必要な時間も延びてくる傾向にあります。
関数のプロトタイプ宣言をしていますと、このようなプログラムミスは、コンパイラーがコンパイル時にエラーメッセージとして通知してくれますので、瞬時にプログラムの誤りに気付くことができるのです。
プロトタイプ宣言の書き方
「プロトタイプ宣言」と言われますと、なにやら難しそうに感じますが、実はとても簡単に記述することができます。
「※プログラム1」に、関数 f のプロトタイプ宣言を追加するには、プログラムの先頭に以下を追記するだけです。
int f(int, int);
つまり、関数 f を記述した最初の1行目「int f(int x, int y)」から、変数名を削除したものにセミコロン「;」を行末に追加して、プログラムの先頭に記述するだけです。
先の「※プログラム1」にプロトタイプ宣言を追加したのが「※プログラム3」です。
※プログラム3 int f(int, int); main() { printf("1 + 2 の答えは %d です。\n", f(1)); } int f(int x, int y) { return x + y; }
「※プログラム3」をコンパイルしますと、以下のように、きちんとコンパイラーがプログラムの誤りを指摘してくれます。
※プログラム3のコンパイル・エラーメッセージ(※開発環境によってメッセージの内容は異なります)
program3.c:5:5: error: too few arguments to function 'f' printf("1 + 2 の答えは %d です。\n", f(1)); ^ program3.c:2:5: note: declared here int f(int, int); ^
標準関数にもプロトタイプ宣言がある
実は、これまでC言語超入門でも使用してきたprintf関数にもプロトタイプ宣言が提供されており、プログラムの先頭に、以下のように記述することで使用することができます。
#include <stdio.h>
開発環境にはstdio.hというファイルあり、その中にprintf関数のプロトタイプ宣言が入っています。
ただ、現時点では、プログラムの先頭に必ず上記のとおり記述することだけ覚えておいていただければ、十分です。
今後のC言語超入門でも、上記の記述をしていきます。
C言語超入門の第13回まとめ
さて、今回のC言語超入門は、プロトタイプ宣言についてお伝えしてきました。
- プロトタイプ宣言について、現時点で必ず覚えていただきたいポイントは、
- コンパイラーが関数の引数チェックのために使用する
- 関数を作成したら、1行目を加工してプログラムの先頭に書く
- printf関数のプロトタイプは、stdio.hというファイルに定義されている
の3つです。
なお関数の作り方について詳しくご説明することを予定していますので、その際に改めて詳しくご説明しますね。
ステップ・バイ・ステップ。焦らず一歩ずつ進んでいきましょう。