K&R风格函数定义问题

以下代码有效:

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"); } 

为什么会这样?

实际上,这是一个有趣的问题。

这与C语言的演变以及它安排向后兼容旧版本的方式有关。

在这两种情况下,你都有foo()的K&R-era定义,但是前面有一个C99声明(带原型)。

但在第一种情况下, int的默认参数实际上是参数,因此函数调用是兼容的。

然而,在第二种情况下,K&R定义引入了K&R时代的标准参数促销规则,并且参数的类型实际上是double

但是,你在呼叫站点使用了一个现代原型,使它成为一个float 。 因此,调用站点的代码可能已经推送了一个真正的float ,这在任何情况下都是double的不同类型。

如果对foo()所有引用都是K&R样式,我相信你得到的最多就是警告,这就是编译器当时会做的事情,编译器必须按照这样的方式编译遗留代码。 它甚至可以是类型安全的调用,因为浮动将全部提升为double,至少对于过程调用接口而言。 (不一定是内部function代码。)