我想知道为什么以下代码:
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不等于(/ *空列表* /),也不是void.
有谁能解释一下?
解决方法
引用关于函数声明符的标准的晚期草稿:
(6.7.6.3/10) The special case of an unnamed parameter of type void as the
only item in the list specifies that the function has no parameters.(6.7.6.3/14) An identifier list declares only the identifiers of the
parameters of the function. An empty list in a function declarator
that is part of a definition of that function specifies that the
function has no parameters.
所以声明和定义的声明符实际上是兼容的,因此引用相同的函数(当然没有重载,因为C中不存在这样的事情)