K& R风格函数定义问题

时间:2011-01-29 18:01:46

标签: c function-declaration

以下代码有效:

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

为什么会这样?

1 个答案:

答案 0 :(得分:22)

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

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

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

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

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

但是,您在呼叫网站上使用了一个现代原型,使其成为float。因此,呼叫网站上的代码可能推送了真实的float,无论如何都是double的不同类型。

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