関数プロトタイプ
歴史的な経緯から、C89、C90およびC95までのC言語では、関数が事前に宣言されていない状況で、左括弧付きで式の中に現われた場合、その関数は暗黙のうちに int を返すものと判断され、引数については何の想定もなされない。この場合コンパイラは、引数の型やアリティをコンパイル時にチェックできない。この暗黙の型指定の仕様が問題を引き起こすケースがある。以下のコードは、暗黙に宣言された場合の関数の振る舞いを示したものである。
関数 "fac" が呼び出されたとき、コールスタックには1つの整数の引数が積まれていなければならない。プロトタイプが省略されると、コンパイラはそれをチェックできず、実行時に "fac" がスタック上の何らかの値(あるいはレジスタにある何らかの値)を引数として使うことになる(スタックの場合、スコープにない変数の値かリターンアドレスを使うことになる)。実引数が実際の関数インタフェースと一致していなかった場合、未定義動作を引き起こす。戻り値に関しても同様で、例えば本来はvoid*を返すmalloc関数をプロトタイプ宣言なしで呼び出そうとすると、intを返す関数とみなされてしまい、やはり未定義動作を引き起こす。
C89では、関数プロトタイプの機能がC++から逆輸入される形で標準化された。