You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何声明带参和无参的同名函数不会引发编译错误?

为什么这两个函数声明不会触发编译冲突?

先拆解代码里的两个声明:

  • int hi(int); 是函数原型,明确告知编译器该函数接受1个int类型的参数,返回值为int。
  • int hi(); 是C语言里的旧式非原型声明,它只说明函数返回int,但对参数的数量、类型不做任何明确约束——注意,这可不是“无参函数”的意思,只是编译器暂时不知道参数的具体要求。

在C语言的规则里,这两个声明并不冲突:非原型声明只给出了最基础的返回值信息,后续的原型声明补充了更具体的参数要求,编译器会以最后出现的、更明确的原型声明作为函数调用的依据。所以你调用hi(3);时,编译器匹配的是int hi(int);的规则,参数类型和数量都符合,自然不会报错。

至于调用无参的hi()会报错,原因很简单:此时编译器已经通过原型声明知道这个函数必须接收1个int参数,你没传参数就违反了这个规则,所以触发编译错误。

补充一点:哪怕把两个声明的顺序反过来(先写非原型、再写原型),结果也是一样的——原型声明会覆盖之前模糊的非原型声明,编译器始终以最明确的那个声明为准。

内容的提问来源于stack exchange,提问作者arye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:59:54