C言語における関数プロトタイプの必要性について解説する

C言語でmain関数以外の関数を使う時に、関数プロトタイプを使うことになるが、今回は「なぜ関数プロトタイプが重要なのか?」の解説をしていく。

関数プロトタイプの重要性について

関数プロトタイプを作る目的は、大きく以下の3つの分けられる。

上記の目的から分かるように、関数プロトタイプはコンパイラに対して、「この関数の型は○○で、引数は△個、そして引数の型は××だよ」と教えるものと言える。

#include <stdio.h>

int sum(int x, int y);

int main(void) {
  int result;
  result = sum(10, 20);
  printf("number is %d", result);
  return 0;
}

int sum(int x, int y) {
  return x + y;
}

上記のコードの関数プロトタイプを見てみると、「sum関数は戻り値がint型、引数はint型で2個あるよ」と宣言している。

もし、関数プロトタイプを宣言しないとどうなるのか?

では、もし関数プロトタイプを宣言しないとどうなるのか?

結論から言うと、コンパイル時にwarning(警告)が出るだけで、問題なくコンパイルが成功する時もある。

例として、先ほどのコードの関数プロトタイプなしバージョンをコンパイルしてみる。

#include <stdio.h>

 int main(void) {
     int result;
     result = sum(10, 20);
     printf("number is %d", result);
     return 0;
 }

 int sum(int x, int y) {
     return x + y;
 }

すると、以下の様な警告文が出てくる。

C:\Users\touma\Desktop\winren>gcc test.c
test.c: In function 'main':
test.c:5:12: warning: implicit declaration of function 'sum' [-Wimplicit-function-declaration]
   result = sum(10, 20);

上記の警告文は、「sum関数が暗黙的な宣言になっているよ(宣言していないよ)」と言うもの。

そして、もし関数プロトタイプを宣言していない場合は、コンパイラが勝手に関数の戻り値をint型に設定するようになっている。

上記の例では戻り値がint型で問題なかったが、戻り値がint型では不都合な場合はエラーが表示されると助かるが、コンパイラは何事もなかったかのように処理を続けてしまう。

なので、多少面倒でも関数プロトタイプを宣言する方が望ましい。

それでも関数プロトタイプを省略したい場合

それでも関数プロトタイプを省略したい場合は、関数をmain関数の前に書くことで自動で関数プロトタイプの宣言にもなるのでおススメ。

例えば、上記のコードを以下の様に変えることで関数プロトタイプの宣言も完了する。

#include <stdio.h>

int sum(int x, int y) {
    return x + y;
}

 int main(void) {
     int result;
     result = sum(10, 20);
     printf("number is %d", result);
     return 0;
 }

最後に参考記事を掲載しておく。(英語だけど)

参考記事:Why do we need prototype in function? – Quora

参考記事:Importance of function prototype in C – GeeksforGeeks

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

SNS Shere

Related Post

C言語のコンパイルにおけるアセンブラ→実行ファイルまでの流れをまとめてみた