- 11/04/2016
- 3 minutes to read
-
- c
- v
- n
- M
- g
-
+1
-
関数プロトタイプは次の重要な用途がある。
int
値を返す関数はプロトタイプを必要としませんが、プロトタイプが推奨されます。 -
完全なプロトタイプがないと、標準変換が行われますが、パラメータの数で型または引数の数を確認する試みは行われません。
-
パラメータリストは、関数呼び出しの引数と関数定義のパラメータの対応をチェックするために使用されます。
関数宣言は関数定義の前にあって名前を特定するものである。 関数の戻り値の型、ストレージクラス、およびその他の属性。 プロトタイプであるためには、関数宣言は関数の引数の型と識別子も設定しなければなりません。
Syntax
declaration:
declaration-specifiers attribute-seqopt init-declarator-listopt ;
/* attribute-seqopt is Microsoft-specific */
declaration-specifiers.Declaration.Declaration:Declaration-Specificiers (宣言仕様)
storage-class-specifier declaration-specifiersopt
type-specifier declaration-specifiersopt
type-qualifier declaration-specifiersopt
init-declarator-list:
init-declarator
init-declarator-list , init-declarator
init-declarator:
declarator
declarator = initializer
declarator:
pointeropt direct-declarator
direct-declarator.DEC:
DECLATOR:DECLATOR
となります。 /* 関数宣言子 */
direct-declarator ( parameter-type-list ) /* 新スタイルの宣言子 */
direct-declarator ( identifier-listopt ) /* 廃スタイル宣言子 */
プロトタイプは関数定義と同じフォームだが、閉じカッコの直後にセミコロンで終了するのでボディが無いのが特徴である。 どちらの場合でも、戻り値の型は関数定義で指定された戻り値の型と一致しなければならない。
各引数の変換型は、関数呼び出しがスタック上に配置する引数の解釈を決定します。 引数とパラメータ間の型の不一致は、スタック上の引数を誤って解釈する原因となることがあります。 例えば、16ビットコンピュータでは、16ビットポインタを引数として渡した後、long
パラメータとして宣言すると、スタック上の最初の32ビットはlong
パラメータとして解釈されます。 このエラーはlong
パラメータだけでなく、それに続くすべてのパラメータに問題を発生させます。
プロトタイプは関数の属性を確立し、その定義に先行する (または他のソースファイルで発生する) 関数への呼び出しが引数型および戻り値の型の不一致をチェックできるようにします。 例えば、プロトタイプで static
storage-class 指定子を指定した場合、関数定義でも static
storage class を指定しなければなりません。
完全なパラメータ宣言 (int a
) と抽象宣言 (int
) を同じ宣言内で混在させることができます。 例えば、以下の宣言は合法である:
int add( int a, int );
プロトタイプは、引数として渡される各式の型と識別子の両方を含むことができる。 しかし、そのような識別子は宣言の終わりまでしかスコープを持たない。 プロトタイプはまた、引数の数が可変であるという事実、または引数が渡されないという事実を反映することができる。 このようなリストがないと、ミスマッチが明らかにならないことがあり、コンパイラはミスマッチに関する診断メッセージを生成することができない。 型チェックの詳細については、「引数」を参照してください。
Microsoft C コンパイラのプロトタイプスコープは、/Za コンパイラオプションでコンパイルする際に ANSI 準拠になりました。 これは、プロトタイプ内で struct
または union
タグを宣言した場合、そのタグはグローバルスコープではなく、そのスコープで入力されることを意味します。 たとえば、ANSI 準拠のために /Za でコンパイルする場合、型の不一致エラーが発生することなくこの関数を呼び出すことはできません。