为何声明带参和无参的同名函数不会引发编译错误?
为什么这两个函数声明不会触发编译冲突?
先拆解代码里的两个声明:
int hi(int);是函数原型,明确告知编译器该函数接受1个int类型的参数,返回值为int。int hi();是C语言里的旧式非原型声明,它只说明函数返回int,但对参数的数量、类型不做任何明确约束——注意,这可不是“无参函数”的意思,只是编译器暂时不知道参数的具体要求。
在C语言的规则里,这两个声明并不冲突:非原型声明只给出了最基础的返回值信息,后续的原型声明补充了更具体的参数要求,编译器会以最后出现的、更明确的原型声明作为函数调用的依据。所以你调用hi(3);时,编译器匹配的是int hi(int);的规则,参数类型和数量都符合,自然不会报错。
至于调用无参的hi()会报错,原因很简单:此时编译器已经通过原型声明知道这个函数必须接收1个int参数,你没传参数就违反了这个规则,所以触发编译错误。
补充一点:哪怕把两个声明的顺序反过来(先写非原型、再写原型),结果也是一样的——原型声明会覆盖之前模糊的非原型声明,编译器始终以最明确的那个声明为准。
内容的提问来源于stack exchange,提问作者arye
相关产品推荐
相关产品推荐

