関数プロトタイプ

以前のバージョンの C では、関数が事前に宣言されておらず、その名前が左括弧に続く式の中にある場合、それは int を返す関数として暗黙的に宣言され、その引数については何も想定されませんでした。 この場合、コンパイラは、関数がいくつかの引数に適用されたときに、引数の型とSyntaxのアリティのコンパイル時チェックを行うことができない。 これは問題を引き起こす可能性がある。 次のコードは、暗黙的に宣言された関数の動作が未定義である状況を示しています。

#include <stdio.h>/* If this prototype is provided, the compiler will catch the error in * |main|. If it is omitted, then the error may go unnoticed. */int MyFunction(int n); /* Prototype */int main( void ) /* Calling function */{ printf("%d\n", MyFunction()); /* Error: forgot argument to MyFunction */ return 0;}int MyFunction( int n ) /* Called function definition */{ if (n == 0) { return 1; } else { return n * MyFunction(n - 1); }}

The function MyFunction expects an integer argument to be on the stack or in a register when it is called.これは、暗黙的に宣言された関数が呼び出されたときに、スタックまたはレジスタにある整数の引数を期待します。 プロトタイプが省略された場合、コンパイラはこれを強制する方法がなく、MyFunction はスタック上の他のデータ (おそらくリターンアドレスまたは現在スコープ内にない変数の値) で動作することになります。 関数プロトタイプを含めることで、関数MyFunctionが1つの整数の引数を取ることをコンパイラに知らせ、コンパイラがこの種のエラーをキャッチしてコンパイルプロセスを円滑に進めることを可能にします。

ライブラリインタフェースの作成 編集

関数プロトタイプをヘッダファイルに記述することにより、ライブラリのインタフェースを指定することができる。

コメントを残す

メールアドレスが公開されることはありません。