関数プロトタイプ




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


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




目次






  • 1


  • 2 用法


    • 2.1 コンパイラへの通知


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


    • 2.3 クラス宣言




  • 3 参考文献







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


int fac(int n);

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



用法



コンパイラへの通知


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


 #include <stdio.h>

/*
* もし、このプロトタイプがあれば、コンパイラはmain()でのエラーを
* 検出できる。省略されると、エラーには気づかない。
*/
int fac(int n); /* プロトタイプ */

int main() { /* 関数呼び出し */
printf("%dn", 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 



Popular posts from this blog

Арзамасский приборостроительный завод

Zurdera

Крыжановский, Сергей Ефимович