K&R风格函数定义问题
Posted
技术标签:
【中文标题】K&R风格函数定义问题【英文标题】:K&R style function definition problem 【发布时间】:2011-06-17 19:58:42 【问题描述】:以下代码有效:
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");
为什么会这样?
【问题讨论】:
作品是什么意思?它是否编译?它运行还是不运行?有什么问题? 因为第二个例子的有效语法比我们任何一个人活着的时间都长? @Nick:不,它不能编译。这是错误:“foo”的类型冲突。 【参考方案1】:实际上,这是一个有趣的问题。
这与 C 语言的演变以及它向后兼容旧版本的方式有关。
在这两种情况下,foo()
都有一个 K&R 时代的定义,但之前有一个 C99 声明(带有原型)。
但是第一种情况,int
的默认参数其实就是参数,所以函数调用是兼容的。
不过,在第二种情况下,K&R 定义引入了 K&R 时代的标准参数提升规则,参数的类型实际上是 double
。
但是,您在呼叫站点使用了现代原型,将其设为float
。所以调用站点的代码可能推送了一个真正的float
,无论如何它都是与double
不同的类型。
如果所有对 foo()
的引用都是 K&R 风格,我相信你得到的最多将是一个警告,这就是编译器当时会做的事情,编译器必须这样做才能编译遗留代码.它甚至可能是一个类型安全的调用,因为浮点数都将被提升为双精度,至少对于过程调用接口是这样。 (内部功能码不一定。)
【讨论】:
严格来说,我应该说包含将浮点参数提升为双精度的规则称为默认参数提升。此外,我们通常将任何版本的 ANSI C 称为 C99,因为 C99 标准取代了 C89 标准。但既然我们专门讨论了语言进化,也许我应该注意到原型表达式起源于 C89。 严格来说,ANSI C 从 1990 年就已经过时了,因为 ANSI C = C89。第一个 ISO C 标准是 C90。当然,ANSI C 和 C90 在功能上是相同的,只是在章节枚举和其他各种修饰上有所不同。 当然,我试图参考以 ANSI C 开头的原型修订版,但我想“ISO C”会是更好的选择。 这个问题很好,但我永远不会写这样的东西,总是需要一个原型在标题中以上是关于K&R风格函数定义问题的主要内容,如果未能解决你的问题,请参考以下文章
将非 S3 基本函数重新定义为 R 包中的 S3 函数是不好的风格吗?