|
来看一小段程序
#include <stdio.h>
main(t,_,a) //这是K&R C老式的函数声明方法
char *a;
{
...
putchar(31[a]);
...
} [TC编译通过]
奇怪的语句吧......的确如此,如果你明白什么是K&R C大概也就不为此而感到奇怪了。
K&R C的产生:
1978年,C语言经典名著The C Programming Language出版了。这本书受到了广泛的赞誉,其作者Brian Kernighan和Dennis Ritchie也因此名声大噪,所以这个版本的C语言就被称为“K&R C”。K&R C 便是ANSI C的前身了
ANSI C:
1989年12月,C语言标准草案最终被ANSI委员会接纳。随后,国际标准化组织ISO也接纳了ANSI C标准(令人不快的是,它删除了非常有用的“Rationale”一节,并作了个虽然很小却让人很恼火的修改,就是把文档的格式和段落编码作了改动)。ISO是一个国际性组织,从技术上讲它更权威一些。所以在1990年初,ANSI重新采纳了ISO C(同样删除了Rationale),取代了原先的版本。因此从原则上说,ANSI所采纳的C语言标准是ISO C,我们日常所说的标准C也应该是ISO C。
ANSI C中最重要的新特性就是“原型”,这种特性取自C++。原型是函数声明的扩展,这样不仅函数名和返回类型已知,所有的形参类型也是已知的。这就允许编译器在参数的使用和声明之间检查一致性。把“原型”称作是“带有所有参数的函数名”是不够充分的,它应该被称作“函数签名(function signiture)”,或者像Ada那样称作“函数说明(function specification)”。
原型的形成
原型的目的是当我们对函数作前向声明(forward declaration)时,在形参类型中增加一些信息(而不仅仅是函数名和返回类型)。这样,编译器就能够在编译时对函数调用中的实参和函数声明中的形参之间进行一致性检查。在K&R C中,这种检查被推迟到链接时,或者干脆不作检查。使用原型以后,原先的:
char * strcpy();
现在在头文件中的形式如下:
char * strcpy(char *dst, const char *src);
可以省略参数名称,只保留参数类型:
char * strcpy(char *, const char *);
但最好不要省略形参名。尽管编译器并不理睬形参的名称,但它们经常能向程序员们传递一些有用的信息。类似地,函数的定义也从:
char * strcpy(dst, src)
char *dst, *src;
{ ... }
变成了:
char * strcpy(char *dst, const char *src) /* 注意没有分号 */
{ ... }
函数头不再以一个分号结尾,而是在后面紧接一个组成函数体的复合语句。
每次编写新函数时都应该使用原型,并确保它在每次调用时都可见。不要回到K&R C老式的函数声明方法,除非需要使用缺省的类型升级。
Powered by Discuz! X5.0
© 2001-2026 Discuz! Team.