これはC標準(少なくとも1999年以前)で必要とされているため、コードがコンパイルされます。 1999年の標準ではサポートが中止されましたが、これ以降も多くのコンパイラがサポートしていますが、そのような場合に警告するように設定することもできます(暗黙の宣言など)。
具体的には、C89/90と事前標準Cとの下位互換性の理由から、関数を呼び出すコードによる暗黙的な呼び出しでは、関数はint
を暗黙的に宣言し、可変引数リストを受け入れます。関数が同じ名前を持っているので
これは、コンパイラがa.c
リンクを通じて働いているときに起こることですが、それは、動作します。
実際には、関数の呼び出し方法(戻り値の使用方法と引数の種類数)が関数の定義方法と一致する場合に機能します。一致するものがない場合、結果は未定義の可能性があります。たとえば、関数が4つの引数で定義され、すべて4を使用するが、呼び出し元が3を提供する場合、その動作は未定義です。同様に、関数がdouble
を返すように定義されていても、呼び出し元はint
を返すと仮定しています。
実際には、すべてのコンパイル単位が呼び出される前に(たとえば、ヘッダーを含めて)、すべてのコンパイル単位ですべての関数を宣言する方がよいです。これにより、コンパイラは、関数の呼び出し方法が宣言と一致するかどうかをチェックできます。
すべてのC標準でmain()
はvoid
ではなくint
を返します。 void
を返すmain()
のサポートは、コンパイラ拡張です。
これらは接続されていますか? –
警告が表示されましたか?あなたのコードに 'gcc'を使用すると、' 'test''の暗黙の宣言の警告が表示されます。 – lurker
Cチュートリアルの本を購入してください。それから、なぜあなたは理解するでしょう。警告をオフにしないでください –