簡単な答え:に変更int testlib()
しint testlib(void)
て、関数が引数を取らないように指定します。
プロトタイプは、定義により、関数の引数(複数可)の指定タイプ(s)は、その関数の宣言です。
次のような非プロトタイプの関数宣言
int foo();
引数の数や型を指定しない旧式の宣言です。(1989 ANSI C標準以前は、これは言語で使用できる唯一の種類の関数宣言でした。)そのような関数は任意の数の引数で呼び出すことができ、コンパイラーは文句を言う必要はありませんが、呼び出しが定義と矛盾しています。プログラムに未定義の動作があります。
1つ以上の引数を取る関数の場合、宣言で各引数のタイプを指定できます。
int bar(int x, double y);
引数のない関数は特殊なケースです。論理的には、空の括弧は引数を指定するための良い方法でしたが、その構文は古いスタイルの関数宣言ですでに使用されていたため、ANSI C委員会はvoid
キーワードを使用して新しい構文を発明しました。
int foo(void); /* foo takes no arguments */
関数定義(関数が実際に実行するコードを含む)も宣言を提供します。あなたの場合、あなたは次のようなものを持っています:
int testlib()
{
/* code that implements testlib */
}
これにより、の非プロトタイプ宣言が提供されtestlib
ます。定義として、これはtestlib
パラメーターがないことをコンパイラーに通知しますが、宣言として、testlib
引数の指定されていないが固定された数とタイプをとるコンパイラーのみに通知します。
宣言に変更()
する(void)
とプロトタイプになります。
プロトタイプの利点は、誤っtestlib
て1つ以上の引数を指定して呼び出した場合、コンパイラーがエラーを診断することです。
(C ++にはわずかに異なる規則があります。C++には古いスタイルの関数宣言がありません。空の括弧は、関数が引数を取らないことを具体的に意味します。C++はC (void)
との一貫性のための構文をサポートします。 CおよびC ++として、おそらく()
C ++ではinを、Cでは(void)
構文を使用する必要があります。)