次のコードの理由を知りたいのですが。
void foo(void);
void foo()
{
}
gccで有効です。Cでは、オーバーロードのようなものはなく、上記の宣言(実際には、そのうちの1つは定義です)は2つの異なる関数を宣言します(最初の関数は引数を取りません、2番目の宣言は任意の数の引数を取ることができます)タイプ)。
ただし、最初の関数の定義を提供する場合:
void foo(void)
{
}
void foo()
{
}
今回は再定義のためにコンパイルが失敗します。しかし、それでも、最初のコードは正しく、次のように混乱する可能性があります。
void foo(void);
int main(void)
{
foo(); //OK
//foo(5); //Wrong, despite ->the definition<- allows it
}
void foo()
{
}
一方、このようなものはすぐには無効です。
void foo(int);
void foo() //error: number of arguments doesn't match prototype
{
}
私の最初の前述のコードと比較すると、コンパイラの動作はちょっと奇妙だと思います。int
は等しくなく(/*empty list*/)
、どちらも等しくありませんvoid
。
誰かがこれを説明できますか?