函数声明
一个函数要调用另外一个函数
首先是被调用的函数必须存在
其次还应在主调函数中对所有被调函数加以说明
否则,在出现连接时会出现找不到所调用函数的错误信息
为什么?
C语言可以由若干个文件组成,每一个文件可以单独编译,在编译程序中的函数调用时,如果不知道该函数参数的个数和类型,编译系统就无法检查形参和实参是否匹配
为了保证函数调用成功。必须为编译程序提供所调用函数的返回值类型和参数的类型及个数
函数的调用也应遵循“先定义后使用”的原则
被调函数的声明
被调函数是c语言系统提供的标准库函数
在源程序文件的开头处,使用#include命令,将存放所调用库函数的有关“头文件”包含到该程序文件中来
#include命令的一般形式为
#include
#include "stdio.h"
用户自定义函数的声明
被调用函数为用户自己定义的函数
一般情况下,应在主调用函数中对被调用函数(返回值)的类型进行说明
形式
函数类型 函数名 (形参类型1 形参名1, 形参类型2 形参名2…)
说明
为编译系统进行类型检查提供依据
函数值是什么类型
有多少个参数
每一个参数是什么类型的
用户自定义函数的声明
提示,在下列情况下可以省略函数声明
当函数的返回值为整形或字符型时
如果在同一个文件中既定义函数,又调用该函数
不论定义函数与调用函数在源程序中的位置关系如何,都可以省去函数说明
此时系统对其自动按整形处理
例;求两个非负数的最大公约数
分析:采用“转辗相除”法
样式:
float max_value();
vaid cpy();
int count();
main()
{…
}void cpy(s1, s2)
char s1[30],s2[20];
{…
}
int count (char str ,int n)
{…
}
main()不必再声明所调用的函数类型
,因此没有包含
float max_value();
void cpy();
int count();
的声明语句,既没有对这三个被调函数进行类别说明
提示,在下列函数下必须函数声明
如果函数定义在源程序中的位置在调用该函数之后
必须在调用该函数的函数中给出被调用函数的说明
如果函数的定义与调用在两个不同的文件中
不论函数返回值的类型是什么,在调用该函数时都必须给出函数声明
提示!
函数的声明和函数的定义形式上十分相似,但两者上有本质上的不同。
函数的定义是一个完整而独立的函数单元
包括;函数类型、函数名、形参及形参类型、函数体等
在程序中,函数的定义只能有一次
函数首部后没有“;”
函数的声明仅是对编译系统的一个说明
是对已定义过的函数返回值的类型说明,以通知系统在本函数中所调用的函数是什么类型
不包括函数体(或形参)
调用几次该函数,就应在各个主调函数中各自做多次说明
是一个说明语句,必须以分号结束
例;
main()
{float a,b,c,max;
float max_value();/*对被调函数类型进行声明*/
scanf("%f%f%f",&a,&b,&c);
printf("%f",max);
}
float max-value(x,y,z)
float x,y,z;
{float max;
max=x>y?x:y;
max=max>z?max:z;
return(max);
}
被调函数之后定义在主调函数之后,所以在主调函数的声明部分对被调函数的类型(既返回值的类型)进行了说明。也可以写成:
float max_value
(float,float,float);
函数原型
对被调函数的声明
编译系统需知道被调函数有几个参数,各自是什么类型,而参数的名字是无关紧要的
简化对被调函数的声明
函数类型标识符 函数名(形参类型1,形参类型2…...);
上述方式称为函数的原型
例
float max_volue(float,float,float);
/*仅声明形参的类型,不必指出形参的名*/
通常将一个文件中需调用的所有函数原型写在文件的开始
写法上要注意
函数定义的首部需要写出所有形参名并给出其对应的数据类型
函数原型的主要目的在于声明函数返回值的类型以及函数期望接收的参数的个数、参数类型和参数顺序
如果程序中没有整个函数的函数原型(没有说明),编译系统就会用第一次出现的这个函数(函数定义和或函数调用)构造函数原型
在缺省下编译系统假设函数返回类型为int
而对函数参数类型不作任何假设
常见错误
和函数原型不匹配的函数调用会导致语法错误
函数原型和函数定义不一致,也会产生错误
思考题
什么时候说明函数?
为什么要说明函数原型?
#计算机 #C语言 #编程语言 #
评论:
Souler: 6