我想知道为什么下面的代码:
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
。
任何人都可以解释一下吗?