宣言:
int f();
f
...一部の識別子(この場合は )が関数に名前を付けることをコンパイラに伝え、関数の戻り値の型を伝えますが、関数が意図するパラメータの数または型を指定しません受け取る。
プロトタイプ:
int f(int, char);
...それ以外は似ていますが、関数が受け取る予定のパラメーターの数/タイプも指定します。パラメータを取らない場合は、そのようなものを使用int f(void)
して指定します (括弧を空のままにすることは宣言であるため)。新しいスタイルの関数定義:
int f(int a, char b) {
// do stuff here...
}
...プロトタイプとしても機能します。
スコープ内にプロトタイプがない場合、コンパイラは関数を呼び出す前にデフォルトの昇格を引数に適用します。これは、 anychar
またはshort
it が に昇格しint
、 anyfloat
が に昇格したことを意味しdouble
ます。したがって、(プロトタイプではなく) 関数を宣言する場合は、やパラメータを指定したくありません。そのようなものを呼び出すと、未定義の動作が発生します。デフォルトのフラグを使用すると、基本的にコードを正しく使用する方法がないため、コンパイラはコードを拒否する可能性があります。コードを受け入れるようにするコンパイラフラグのセットを見つけることができるかもしれませんが、とにかくそれを使用できないため、それはかなり無意味です...char
short
float