関数宣言子は、関数が別の関数から呼び出されたとき、また自分自身で呼び出したとき、その 関数に渡すことができるパラメーターのリストを含みます。
関数仮パラメーター宣言の構文 .-,-------------. V | >>-(----+-----------+-+--+--------+--)------------------------->< '-parameter-' '-,--...-'
パラメーター >>-+----------+--type_specifier--+------------+---------------->< '-register-' '-declarator-'
int f()
{
...
}
関数 f は引数を取らないことを表します。しかし、次の例は、
int f();
単に、パラメーターの数および型は不明であることを表しているだけです。
関数が引数を取らないことを明示的に示すために、引数リストをキーワード void に置き換えることができます。int f(void);
int f(int, ...);
少なくとも 1 つのパラメーター宣言と省略符号の前のコンマは、C では両方とも必須です。
関数宣言、すなわち、プロトタイプでは、各パラメーターの型 を指定しなければなりません。 関数定義 では、パラメーターの型が指定されていない場合、int と見なされます。
struct X { int i; };
void print(struct X x);
void print(struct X { int i; } x); // legal
int func(int,long);
一部のコンテキストの場合を除いて、添え字なし配列名 (例えば、 region であって、region[4] ではない) は、配 列が既に宣言されている場合、値が配列の最初のエレメントのアドレスであるポインターを表します。関数のパラメー ター・リスト内の配列型も、対応するポインター型に変換されます。 配列が関数本体内からアクセスされると、引数配列のサイズに関する情報は失わ れます。
この情報は最適化に有用なので、この情報を保持しておくには、static キーワードを 使用して引数配列の指標を宣言するとよいでしょう。 定数式は、最適化の前提事項として使用できる最小のポインター・サイズを指定し ます。 static キーワードの、この特殊な使用法は、厳しい規定があります。 このキーワードは、最外部の配列型派生の中でのみ、そして関数仮パラメーター宣 言でのみ使用できます。 関数の呼び出し側がこのような制限に従っていない場合、動作は未定義です。
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 */