1.对被调用函数的声明
C程序中的一个函数要调用另一个函数,必须具备以下两个条件:
(1)被调用函数已经存在。若是库函数,系统已经定义,否则需要用户自己定义。
(2)在主调函数中对被调用函数先声明,然后才能调用。
对被调用函数在调用前先声明,与使用变量之前要先进行变量定义是一样的。其目的是:使编译系统知道被调用函数返回值的类型,以及函数参数的个数、类型和顺序,便于调用时,对主调函数提供的参数值的个数、类型及顺序是否一致,函数值的类型是否正确等进行对照检查,保证调用的合法性。例如,例6.1主函数main()中的“int max(int n1,int n2);”语句,例6.5主函数main()中的“int max(float x,float y);”语句,都是对被调用函数的声明。
2.函数原型
在ANSI C新标准中,采用函数原型方式对被调用函数进行声明,其一般格式如下:
(1)类型名 函数名(类型名[,类型名…]);
(2)类型名 函数名(类型名 参数名[,类型名 参数名2…]);
其中每个参数的“参数名”可以缺省,因为编译系统并不检查参数名,带上参数名只是为了提高程序的可读性。可见,函数原型与函数定义的首部是一致的,各参数的顺序也必须与函数首部定义的一致,但函数声明是单独作为一条说明语句,因此其末尾必须有分号“;”。例6.1和例6.5中对函数的声明分别可写成“int max(int,int);”和“int max(float,float);”形式。
3.说明
(1)C语言规定,在以下两种情况下,可以省去对被调用函数的声明:(www.xing528.com)
① 当对被调用函数的定义出现在主调函数之前时,可以缺省对被调用函数的声明。因为先定义的函数先编译,在编译主调函数时,被调用函数已经编译,其函数首部已经起到了声明的作用,即编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序,编译系统可以据此检查函数调用的合法性,而在主调函数中不必再声明。
例如,在例6.2、例6.3、例6.4都属于这种情况。
② 如果在所有函数定义之前,在函数外部(例如源文件开始处)预先对各个被调用函数进行了声明,则在主调函数中可缺省对被调用函数的声明。如例6.5可改为:
程序功能未发生任何变化。
(2)函数定义和函数声明是两个不同的概念。
函数定义是对函数功能的确立,包括定义函数名、函数值的类型、函数参数及其函数体等,它是一个完整的、独立的函数单位。在一个程序中,一个函数只能被定义一次,并且是在其他任何函数之外进行的。
函数声明(有的书上也称为“说明”)则是把函数的名称、函数值的类型、参数的个数、类型和顺序通知编译系统,以便在调用该函数时编译系统对函数名称正确与否、参数的类型、个数及顺序是否一致等进行对照检查。在一个程序中,除上述可以缺省函数说明的情况外,所有主调函数都必须对被调用函数进行声明,并且一般是在主调函数的函数体内进行。
(3)对库函数的调用不需要声明,但必须把该库函数的头文件用 #include 命令包含在源文件开始处。
【例6.6】根据三角形三个边的长度求三角形的面积。
这是因为头文件“math.h”中包含了所有数学函数的原型,将该文件的内容包含到程序的开头部分,相当于对所有数学函数作了声明。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。