以下代码有效:
int main()
{
void foo(int);
foo(3);
return 0;
}
void foo(a) int a;
{
printf("In foo\n");
}
但这个没有:
int main()
{
void foo(float);
foo(3.24);
return 0;
}
void foo(a) float a;
{
printf("In foo\n");
}
为什么会这样?
答案 0 :(得分:22)
这与C语言的演变以及它安排向后兼容旧版本的方式有关。
在这两种情况下,你都有foo()
的K& R-era定义,但是之前是C99声明(带原型)。
但在第一种情况下,int
的默认参数实际上是参数,因此函数调用是兼容的。
在第二种情况下,K& R定义引入了K& R时代的标准参数促销规则,参数的类型实际上是double
。
但是,您在呼叫网站上使用了一个现代原型,使其成为float
。因此,呼叫网站上的代码可能推送了真实的float
,无论如何都是double
的不同类型。
如果对foo()
的所有引用都是K& R样式,我相信你得到的最多就是警告,这是编译器当时会做的,编译器必须这样做编译遗留代码。它甚至可以是一个类型安全的调用,因为浮点数将被提升为double,至少对于过程调用接口而言。 (不一定是内部功能代码。)