関数プロトタイプ
関数宣言または関数定義を記述し関数名戻り値の型ストレージ クラスなどの属性を指定します。プロトタイプでは関数宣言は関数の引数の型と ID を確立する必要があります。
構文
declaration:
宣言指定子属性 opt 宣言リスト **;**seq initoptseq 属性 は /*opt */Microsoft 仕様です。
宣言指定子 :
ストレージ クラス指定子の宣言指定子 opt型指定子の宣言指定子 opt
宣言型修飾子の指定子 opt
init 宣言リスト :
init 宣言init 宣言リスト の 宣言 init
init 宣言子 :
宣言宣言子 = 初期化子
declarator:
ポインターを opt 直接宣言直接宣言 : 関数の宣言は /* */
( 直接宣言の 型パラメーター リスト ) の新しい宣言子 /* */直接宣言 ( 識別子 の 一覧 opt**)** のスタイルの宣言時代遅れ /* */
プロトタイプは関数定義と同じ形式があります。ただしその右かっこの後のセミコロンで終了され本体がありません。いずれの場合も戻り値の型は関数定義で指定されている戻り値の型と一致する必要があります。
関数プロトタイプに次の重要な用途があります :
これらは int 以外の関数の戻り値の型と戻り値の型を設定します。これらの int が評価される関数のプロトタイプは必要ではありませんがプロトタイプをお勧めします。
完全なプロトタイプがない場合標準変換が行われますがパラメーターの数を含む引数の型または数を確認しようとは実行されません。
これらの関数を定義する前にプロトタイプが関数へのポインターを初期化できます。
パラメーター リストは関数定義のパラメーターの関数呼び出しに引数の対応を確認するために使用されます。
各パラメーターの変換後の型は引数の解釈をスタックの関数呼び出しの場所を指定します。パラメーターと引数の間の型の不一致がスタックの引数を誤って解釈する場合があります。たとえば16 ビット コンピューターでは16 ビット ポインターを引数として渡されたりlong のパラメーターとしてスタックの最初の 32 ビットとして宣言されている場合 long のパラメーターとして解釈されます。このエラーは long のパラメーターにのみ後続のすべてのパラメーターの問題が発生します。すべての関数の完全な関数プロトタイプの宣言にこの種類のエラーを検出できます。
プロトタイプを定義して前の引数の型と戻り値の型の不一致の関数の呼び出し (または他のソース ファイルに発生します) を確認できるように属性を設定します。たとえばプロトタイプで 静的 " ストレージ クラスの指定子を指定する場合は関数定義で 静的 のストレージ クラスを指定する必要があります。
完全なパラメーター宣言 int a() は同じ宣言の抽象 intdeclarators () と混在させることができます。たとえば次の宣言があります :
int add( int a, int );
プロトタイプは引数として渡された各式識別子と型の両方を含めることができます。ただしこのような識別子に宣言の最後までの範囲のみがあります。プロトタイプは引数の数が可変であるかまたは引数が渡されない反映することができます。このような一覧がない場合表示されるコンパイラでは関連する診断メッセージを生成できません。型チェックの詳細については 引数 を参照してください。
Microsoft C コンパイラのプロトタイプのスコープは /Za コンパイラ オプションを使用してコンパイルする場合ANSI 準拠しています。これはグローバル スコープではなくそのスコープでプロトタイプ内の struct または 共用体 のタグを宣言した場合Enter タグを意味します。たとえばANSI 準拠するために /Za を指定してコンパイルすると型の不一致エラーを取得するにはこの関数を呼び出すことができない :
void func1( struct S * );
コードを修正するには関数プロトタイプの前にグローバル スコープで struct または 共用体 を定義または宣言する :
struct S;
void func1( struct S * );
/Ze の下にタグはグローバル スコープに追加します。