11.1.3 関数呼び出し

あるファイルにおいてある関数を呼び出す時,そのファイル内にその関数の定義がない場合,またはその関数の定義を含むがその関数の定義よりも前にその関数を呼び出す場合,その関数の呼出しより前にその関数のプロトタイプを宣言することを推奨します。

関数呼出し時に仮引数の型がわからない時,コンパイラは関数定義における仮引数の型とは異なる型で関数を呼びだす可能性があり,その場合,プログラムの実行結果が不正になるためです。

int型やunsigned int型より小さい算術型はint型,またはそれで表現できない型はunsigned int 型に,float型はdouble型になります。
その他については,「(7) 既定の実引数拡張」を参照してください。

例 1.

不正な実行結果になるプログラム

AAA.c:
        void func(char a, char b);  //2つの引数は各々A, Xレジスタから受け取る
BBB.c:
        extern void func();         //引数の型が明示されていないのでプロトタイプ宣言ではない
        void main (void)
        {
                char    x=1, y=1;
                func(x, y);         //xとyは各々,intに拡張され,AX,BCレジスタに
        }                           //割り付けられて関数呼び出しが行われる

例 2.

正しい実行結果になるプログラム

AAA.c:
        void func(char a, char b);          //2つの引数は各々A, Xレジスタから受け取る
BBB.c:
        extern void func(char a, char b);   //プロトタイプ宣言
        void main (void)
        {
                char    x=1, y=1;
                func(x, y);                 //2つの引数は各々A, Xレジスタに割り付けられて
        }                                   //関数呼び出しが行われる

 

コンパイル・オプション“-refs_without_declaration”を指定すると関数の宣言がないことを検査できます。

プロトタイプが無い関数を呼び出すと,エラーとなります。