我想知道为什么下面的代码:
void foo(void);
void foo()
{
}
在 gcc 中有效。在 C 中,没有重载之类的东西,上面的声明(实际上,其中一个是定义)声明了两个不同的函数(第一个不带任何参数,第二个可以带任意数量的任何参数)类型)。
但是,如果我们为第一个函数提供定义:
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
。
谁能解释一下?