两个带有void和空参数列表的函数声明

两个带有void和空参数列表的函数声明,第1张

概述我想知道为什么以下代码: void foo(void);void foo(){} 在gcc中有效.在C中,没有重载和上面的声明(事实上,其中一个是定义)声明两个不同的函数(第一个不接受任何参数,第二个可以接受任何数量的参数)类型). 但是,如果我们为第一个函数提供定义: void foo(void){}void foo(){} 由于重新定义,此次编译失败.但是,第一个代码仍然是正确 我想知道为什么以下代码:
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中不存在这样的事情)

总结

以上是内存溢出为你收集整理的两个带有void和空参数列表的函数声明全部内容,希望文章能够帮你解决两个带有void和空参数列表的函数声明所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1236640.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-06
下一篇 2022-06-06

发表评论

登录后才能评论

评论列表(0条)

保存