K&R样式函数定义问题

nit*_*tzs 14 c function-declaration

以下代码有效:

int main()
{
   void foo(int);
   foo(3);
   return 0;
}
void foo(a) int a;
{
   printf("In foo\n");
}
Run Code Online (Sandbox Code Playgroud)

但这个没有:

int main()
{
   void foo(float);
   foo(3.24);
   return 0;
}
void foo(a) float a;
{
   printf("In foo\n");
}
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

Dig*_*oss 22

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

这与C语言的发展以及它安排向后兼容旧版本的方式有关.

在这两种情况下,您都有一个K&R时代的定义foo(),但是之前的C99声明(带原型).

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

然而,在第二种情况下,K&R定义引入了K&R时代的标准参数促销规则,参数的类型确实如此double.

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

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