コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

「関数プロトタイプ」の版間の差分

出典: フリー百科事典『ウィキペディア(Wikipedia)』
削除された内容 追加された内容
Af8662 (会話 | 投稿記録)
Cewbot (会話 | 投稿記録)
m Bot作業依頼: sourceタグをsyntaxhighlightタグに置換 (Category:非推奨のsourceタグを使用しているページ) - log
6行目: 6行目:
例として、以下の関数プロトタイプを考える。
例として、以下の関数プロトタイプを考える。


<source lang="c">int fac(int n);</source>
<syntaxhighlight lang="c">int fac(int n);</syntaxhighlight>


このプロトタイプから判ることは、関数名が "fac" であり、その引数は1個で[[整数]]であり、返り値も整数だということである。この関数を使いたい場合、プログラムのどこかで関数定義を提供しなければならない。
このプロトタイプから判ることは、関数名が "fac" であり、その引数は1個で[[整数]]であり、返り値も整数だということである。この関数を使いたい場合、プログラムのどこかで関数定義を提供しなければならない。
14行目: 14行目:
関数が事前に宣言されていない状況で、左括弧付きで式の中に現われた場合、その関数は暗黙のうちに <code>int</code> を返すものと判断され、引数については何の想定もなされない。この場合[[コンパイラ]]は、引数の型や[[アリティ]]をコンパイル時にチェックできない。このことが問題となる場合がある。以下のコードは、暗黙に宣言された場合の関数の振る舞いを示したものである。
関数が事前に宣言されていない状況で、左括弧付きで式の中に現われた場合、その関数は暗黙のうちに <code>int</code> を返すものと判断され、引数については何の想定もなされない。この場合[[コンパイラ]]は、引数の型や[[アリティ]]をコンパイル時にチェックできない。このことが問題となる場合がある。以下のコードは、暗黙に宣言された場合の関数の振る舞いを示したものである。


<source lang="c">
<syntaxhighlight lang="c">
#include <stdio.h>
#include <stdio.h>
36行目: 36行目:
}
}
}
}
</source>
</syntaxhighlight>


関数 "fac" が呼び出されたとき、[[コールスタック]]には1つの整数の引数が積まれていなければならない。プロトタイプが省略されると、コンパイラはそれをチェックできず、実行時に "fac" がスタック上の何らかの値(あるいはレジスタにある何らかの値)を引数としてを使うことになる(スタックの場合、[[スコープ]]にない変数の値かリターンアドレスを使うことになる)。関数プロトタイプを使えば、コンパイラに関数 "fac" が1つの整数引数をとることを知らせることができ、それによってコンパイラはこのようなエラーを検出できるようになる。
関数 "fac" が呼び出されたとき、[[コールスタック]]には1つの整数の引数が積まれていなければならない。プロトタイプが省略されると、コンパイラはそれをチェックできず、実行時に "fac" がスタック上の何らかの値(あるいはレジスタにある何らかの値)を引数としてを使うことになる(スタックの場合、[[スコープ]]にない変数の値かリターンアドレスを使うことになる)。関数プロトタイプを使えば、コンパイラに関数 "fac" が1つの整数引数をとることを知らせることができ、それによってコンパイラはこのようなエラーを検出できるようになる。

2020年7月5日 (日) 22:57時点における版

関数プロトタイプ: Function prototype)は、C言語C++における関数の宣言であり、関数本体を省略して、関数名、アリティ、引数のデータ型、返り値のデータ型を示したもの。関数定義は関数が何をするかを示すが、関数プロトタイプはそのインタフェースを示すと考えることができる。

プロトタイプでは、引数の名前はオプションだが、その型は(ポインタかどうか、constかどうかなど)全修飾付きで必須である。

例として、以下の関数プロトタイプを考える。

int fac(int n);

このプロトタイプから判ることは、関数名が "fac" であり、その引数は1個で整数であり、返り値も整数だということである。この関数を使いたい場合、プログラムのどこかで関数定義を提供しなければならない。

用法

コンパイラへの通知

関数が事前に宣言されていない状況で、左括弧付きで式の中に現われた場合、その関数は暗黙のうちに int を返すものと判断され、引数については何の想定もなされない。この場合コンパイラは、引数の型やアリティをコンパイル時にチェックできない。このことが問題となる場合がある。以下のコードは、暗黙に宣言された場合の関数の振る舞いを示したものである。

 #include <stdio.h>
 
 /* 
  * もし、このプロトタイプがあれば、コンパイラはmain()でのエラーを
  * 検出できる。省略されると、エラーには気づかない。
  */
 int fac(int n);              /* プロトタイプ */
 
 int main() {                 /* 関数呼び出し */
     printf("%d\n", fac());   /* ERROR: fac の引数がない */
     return 0;
 }
 
 int fac(int n) {             /* 呼び出される関数  */
     if (n == 0) {
         return 1;
     }
     else {
         return n * fac(n - 1);
     }
 }

関数 "fac" が呼び出されたとき、コールスタックには1つの整数の引数が積まれていなければならない。プロトタイプが省略されると、コンパイラはそれをチェックできず、実行時に "fac" がスタック上の何らかの値(あるいはレジスタにある何らかの値)を引数としてを使うことになる(スタックの場合、スコープにない変数の値かリターンアドレスを使うことになる)。関数プロトタイプを使えば、コンパイラに関数 "fac" が1つの整数引数をとることを知らせることができ、それによってコンパイラはこのようなエラーを検出できるようになる。

ライブラリインタフェースの生成

関数プロトタイプをヘッダファイルに置くことで、ライブラリインタフェースを指定できる。

クラス宣言

C++では、関数プロトタイプはクラス宣言にも使われる。

参考文献

  • Kernighan, Brian W.; Ritchie, Dennis M. (1988年), The C Programming Language (2nd ed.), Upper Saddle River, NJ: Prentice Hall PTR, ISBN 0131103628