即使声明中的函数签名与定义不匹配,以下代码如何工作?函数声明的参数列表为空,但定义只有一个参数。为什么编译器不报错?
#include <stdio.h>
double f(); //function declaration
int main(void)
{
printf("%f\n", f(100.0));
}
double f(double param) //function definition
{
return 5 * param ;
}
它编译并运行良好(ideone)。
但是,如果我将定义中的参数类型从double
to更改为float
,则会出现以下错误(ideone):
prog.c:7:错误:“f”的类型冲突<br> prog.c:8:注意:具有默认提升的参数类型无法匹配空参数名称列表声明
prog.c:2:错误: 之前的 'f' 声明在这里
有什么问题float
?为什么它会给出错误float
而不是 with double
?
这是声明和定义对的列表,以及哪些对有效,哪些无效:
作品(ideone)
double f(); //declaration double f(double param); //definition
不起作用(ideone)
double f(); //declaration double f(float param); //definition
作品(ideone)
float f(); //declaration float f(double param); //definition
不起作用(ideone)
float f(); //declaration float f(float param); //definition
所以看起来,只要参数类型是float
,它就不起作用!
所以我基本上有两个问题:
- 为什么即使声明和定义不匹配,第一个示例仍然有效?
- 为什么当参数类型为 时它不起作用
float
?
我尝试理解第 §6.5.2.2 (C99) 部分,但该语言非常神秘,以至于我无法清楚地理解。我什至不知道我是否阅读了正确的部分。所以请用简单的话来解释这些行为。