为何无函数声明时整数版C代码正常,浮点版报类型冲突错误?
为什么浮点版C代码报错而整数版正常?
这事儿的核心得从C语言旧标准里的隐式函数声明规则说起,咱们一步步拆解:
先看浮点版出错的原因
先把浮点版的代码贴出来方便对比:
float pie = 3.14; int main() { float r,res; printf("Enter radius value\n"); scanf("%f", &r); res=area( r ); // 这里调用了未声明的area函数 printf("Area = %f\n",res); } float area( float r ) { return pie * r * r; }
在C89(旧版C标准)里,如果你调用一个事先没有声明/定义的函数,编译器会自动做一个「隐式声明」:
- 默认这个函数的返回值是
int类型 - 参数类型会根据你调用时传入的实参来推导
所以在浮点版的main里,你传入的实参r是float类型,编译器就会隐式声明出这么一个函数:
int area(float);
但你后面实际定义的area函数返回值是float,这就和之前的隐式声明返回类型冲突了,所以编译器就抛出了那个「conflicting types for 'area'」的错误。
再看整数版为啥能正常运行
同样先贴整数版代码:
float pie = 3.14; int main() { int r,res; printf("Enter radius value\n"); scanf("%d", &r); res=area( r ); // 同样调用未声明的area printf("Area = %d\n",res); } int area( int r ) { return pie * r * r; }
还是用C89的隐式声明规则来看:
你在main里传入的实参r是int类型,编译器的隐式声明就变成了:
int area(int);
而你后面实际定义的area函数,返回值是int、参数也是int,和隐式声明完全匹配!所以编译器不会觉得有问题,代码就能正常编译运行了。
额外补充个小知识点
到了C99及以后的标准,已经彻底取消了「隐式函数声明」这个规则,现在主流编译器(比如GCC、Clang)在遇到未声明就调用的函数时,至少会给你一个警告,甚至直接报错。所以不管是浮点版还是整数版,在现代编译器下都应该先声明函数(比如在main之前加float area(float);或者int area(int);),才是规范的写法。
内容的提问来源于stack exchange,提问作者Poornima
相关产品推荐
相关产品推荐

