パラメーター宣言

関数宣言子は、関数が別の関数から呼び出されたとき、また自分自身で呼び出したとき、その 関数に渡すことができるパラメーターのリストを含みます。

構文図を読む構文図をスキップする
 関数仮パラメーター宣言の構文 

      .-,-------------.                  
      V               |                  
>>-(----+-----------+-+--+--------+--)-------------------------><
        '-parameter-'    '-,--...-'      

構文図を読む構文図をスキップする
 パラメーター

>>-+----------+--type_specifier--+------------+----------------><
   '-register-'                  '-declarator-'   

関数定義 の中に空の引数リストがある場合、その関数が引数を取らな いことを表します。 関数宣言 の中の空の引数リストは、その関数は任意の数の引 数、または任意の型の引数を取ることができることを表します。したがって、次の例は、
int f()
{
...
}
関数 f は引数を取らないことを表します。しかし、次の例は、
int f();
単に、パラメーターの数および型は不明であることを表しているだけです。 関数が引数を取らないことを明示的に示すために、引数リストをキーワード void に置き換えることができます
int f(void);
パラメーター指定の終わりにある省略符号は、 関数が、可変数のパラメーターを持っていることを指定するために使用します。 パラメーターの数は、パラメーター指定の数に等しいか、またはそれより多くなります。
      int f(int, ...);

少なくとも 1 つのパラメーター宣言と省略符号の前のコンマは、C では両方とも必須です。

パラメーターの型

関数宣言、すなわち、プロトタイプでは、各パラメーターの型 を指定しなければなりません。 関数定義 では、パラメーターの型が指定されていない場合、int と見なされます。

ユーザー定義型の変数を、次の例に示したように、パラメーター宣言で宣言することができま す。この例では、x は、初めて宣言されています。
struct X { int i; };
void print(struct X x);
ユーザー定義型は、パラメーター宣言内でも定義できます。
void print(struct X { int i; } x);   // legal 

パラメーターの名前

関数定義 では、パラメーターの ID は必須です。関数宣言、すなわち、プロトタイプでは、ID の指定はオプションです。したがって、次の例は、関数宣言では有効です。
int func(int,long);

関数仮パラメーター宣言の中の静的配列指標 (C のみ)

一部のコンテキストの場合を除いて、添え字なし配列名 (例えば、 region であって、region[4] ではない) は、配 列が既に宣言されている場合、値が配列の最初のエレメントのアドレスであるポインターを表します。関数のパラメー ター・リスト内の配列型も、対応するポインター型に変換されます。 配列が関数本体内からアクセスされると、引数配列のサイズに関する情報は失わ れます。

この情報は最適化に有用なので、この情報を保持しておくには、static キーワードを 使用して引数配列の指標を宣言するとよいでしょう。 定数式は、最適化の前提事項として使用できる最小のポインター・サイズを指定し ます。 static キーワードの、この特殊な使用法は、厳しい規定があります。 このキーワードは、最外部の配列型派生の中でのみ、そして関数仮パラメーター宣 言でのみ使用できます。 関数の呼び出し側がこのような制限に従っていない場合、動作は未定義です。

注: この機能は C99 固有です。
次の例は、この機能の使われ方を示しています。
void foo(int arr [static 10]);       /* arr points to the first of at least
                                           10 ints                           */
void foo(int arr [const 10]);        /* arr is a const pointer               */
void foo(int arr [static const i]);  /* arr points to at least i ints;
                                           i is computed at run time.        */
void foo(int arr [const static i]);  /* alternate syntax to previous example */
void foo(int arr [const]);           /* const pointer to int                 */