关于 ANSI C 函数声明,这与旧的 K&R 风格有何改进?我知道它们之间的区别,我只是想知道使用旧样式会出现什么问题以及新样式是如何改进的。
旧式函数声明特别是,不允许对调用进行编译时检查。
例如:
int func(x, y)
char *x;
double y;
{
/* ... */
}
...
func(10, 20);
当编译器看到调用时,它不知道函数参数的类型func
,因此无法诊断错误。
相比之下:
int better_func(char *x, double y) {
/* ... */
}
...
better_func(10, 20);
将导致编译器错误消息(或至少是警告)。
另一个改进:原型使得函数具有类型参数成为可能float
,并且整数类型窄于int
(the 3 char
类型和两个short
类型)。没有原型,float
被提升为double
,并且窄整数类型被提升为int
or to unsigned int
。有了原型,float
参数作为float
(除非函数是可变的,比如printf
,在这种情况下,旧规则适用于可变参数)。
The C 基本原理 http://www.open-std.org/jtc1/sc22/wg14/www/C99RationaleV5.10.pdf文档在第 6.7.5.3 节中对此进行了讨论,可能比我的更好:
函数原型机制是最有用的补充之一
到C语言。当然,该功能在许多领域都有先例
过去 25 年源自 Algol 的语言。具体形式
标准中采用的内容很大程度上基于 C++。
函数原型提供了强大的翻译时错误
检测能力。在没有原型的传统 C 实践中,
译者很难发现错误(错误
参数的数量或类型)调用另一个中声明的函数
源文件。此类错误的检测发生在运行时
或通过使用辅助软件工具。
在不在函数原型范围内的函数调用中,整数
论点有整数促销应用和float参数被扩大到double。在这样的通话中这是不可能的
通过未转换的char or float争论。功能
原型让程序员可以明确地控制函数
参数类型转换,因此经常不合适和
有时,参数的默认扩展规则效率低下
被实施压制。
还有更多;去读吧。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)