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风格函数定义问题的主要内容,如果未能解决你的问题,请参考以下文章

我喜欢 c.vim 插件,但我不使用 K&R 代码风格

将非 S3 基本函数重新定义为 R 包中的 S3 函数是不好的风格吗?

R 写作风格 - 要求 vs. ::

在 R 中绘制 Haar 函数

R语言基础-数学&统计&概率&字符串处理函数|自定义函数|流程控制语句

R语言基础-数学&统计&概率&字符串处理函数|自定义函数|流程控制语句