C 関数定義
関数定義は、関数の名前、受け取ることを想定するパラメーターの種類と数、および戻り値の型を指定します。 関数定義には、ローカル変数の宣言を持つ関数本体と、関数の処理を決定するステートメントも含まれます。
構文
translation-unit:
external-declaration
translation-unitexternal-declaration
external-declaration: /* 外部 (ファイル) スコープでのみ使用できます */
function-definition
declaration
function-definition:
declaration-specifiersoptattribute-seqoptdeclaratordeclaration-listoptcompound-statement
/* attribute-seq は Microsoft 固有の仕様です */
プロトタイプ パラメーターは次のとおりです。
declaration-specifiers:
storage-class-specifierdeclaration-specifiersopt
type-specifierdeclaration-specifiersopt
type-qualifierdeclaration-specifiersopt
declaration-list:
declaration
declaration-listdeclaration
declarator:
pointeroptdirect-declarator
direct-declarator: /* 関数宣言子 */
direct-declarator(parameter-type-list) /* 新しい形式の宣言子 */
direct-declarator(identifier-listopt) /* 古い形式の宣言子 */
定義のパラメーター リストは、この構文を使用します。
parameter-type-list: /* パラメーター リスト */
parameter-list
parameter-list, ...
parameter-list:
parameter-declaration
parameter-list,parameter-declaration
parameter-declaration:
declaration-specifiersdeclarator
declaration-specifiersabstract-declaratoropt
旧式の関数定義のパラメーター リストは、この構文を使用します。
identifier-list: /* 古い形式の関数定義と宣言で使用します */
identifier
identifier-list,identifier
関数本体の構文は次のとおりです。
compound-statement:
{declaration-listoptstatement-listopt}
関数宣言を変更できるストレージ クラスの指定子は extern と static だけです。 extern 指定子は、関数が他のファイルから参照できること、つまり、関数名はリンカーにエクスポートされることを指定します。 static 指定子は、関数が他のファイルから参照できないこと、つまり、名前がリンカーによってエクスポートされないことを示します。 ストレージ クラスが関数定義に表示されない場合、extern と見なされます。 いずれの場合も、関数は定義位置からファイルの末尾まで常に参照可能です。
省略可能な declaration-specifiers と必須の declarator によって、関数の戻り値の型と名前が指定されます。 declarator は、関数の名前を指定する識別子と、関数名の後に続くかっこの組み合わせです。 省略可能な attribute-seq 非終端要素は、「関数の属性」で定義する Microsoft 固有の機能です。
(declarator 構文内の) direct-declarator は、定義されている関数の名前とそのパラメーターの識別子を指定します。 direct-declarator に parameter-type-list が含まれる場合、そのリストですべてのパラメーターの型を指定します。 このような宣言は、それ以降の関数の呼び出しに対する関数プロトタイプとしても機能します。
関数定義の declaration-list の declaration には、register 以外の storage-class-specifier を含めることはできません。 declaration-specifiers 構文の type-specifier は、register ストレージ クラスが int 型の値に対して指定されている場合にのみ省略できます。
compound-statement は、ローカル変数宣言、外部で宣言された項目への参照、およびステートメントを含む関数本体です。
「関数の属性」、「ストレージ クラス」、「戻り値の型」、「パラメーター」、および「関数本体」の各セクションでは、関数定義のコンポーネントについて詳しく説明します。