网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 375|回复: 0
打印 上一主题 下一主题

【C语言】函数声明

[复制链接]

686

主题

693

帖子

3101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3101
跳转到指定楼层
楼主
发表于 2024-4-15 17:52:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。

所谓声明(Declaration),就是告诉编译器我要使用这个函数,你现在没有找到它的定义不要紧,请不要报错,稍后我会把定义补上。

函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示:
dataType  functionName( dataType1 param1, dataType2 param2 ... );
也可以不写形参,只写数据类型:
dataType  functionName( dataType1, dataType2 ... );
函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等与该函数有关的信息,称为函数原型(Function Prototype。函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

有了函数声明,函数定义就可以出现在任何地方了,甚至是其他文件、静态链接库、动态链接库等。

【实例1】定义一个函数 sum(),计算从 m 加到 n 的和,并将 sum() 的定义放到 main() 后面。
  • #include <stdio.h>
  • //函数声明
  • int sum(int m, int n);  //也可以写作int sum(int, int);
  • int main(){
  •     int begin = 5, end = 86;
  •     int result = sum(begin, end);
  •     printf("The sum from %d to %d is %d\n", begin, end, result);
  •     return 0;
  • }
  • //函数定义
  • int sum(int m, int n){
  •     int i, sum=0;
  •     for(i=m; i<=n; i++){
  •         sum+=i;
  •     }
  •     return sum;
  • }


我们在 main() 函数中调用了 sum() 函数,编译器在它前面虽然没有发现函数定义,但是发现了函数声明,这样编译器就知道函数怎么使用了,至于函数体到底是什么,暂时可以不用操心,后续再把函数体补上就行。

【实例2】定义两个函数,计算1! + 2! + 3! + ... + (n-1)! + n!的和。
  • #include <stdio.h>
  • // 函数声明部分
  • long factorial(int n);  //也可以写作 long factorial(int);
  • long sum(long n);  //也可以写作 long sum(long);
  • int main(){
  •     printf("1!+2!+...+9!+10! = %ld\n", sum(10));
  •     return 0;
  • }
  • //函数定义部分
  • //求阶乘
  • long factorial(int n){
  •     int i;
  •     long result=1;
  •     for(i=1; i<=n; i++){
  •         result *= i;
  •     }
  •     return result;
  • }
  • // 求累加的和
  • long sum(long n){
  •     int i;
  •     long result = 0;
  •     for(i=1; i<=n; i++){
  •         result += factorial(i);
  •     }
  •     return result;
  • }


运行结果:
1!+2!+...+9!+10! = 4037913

初学者编写的代码都比较简单,顶多几百行,完全可以放在一个源文件中。对于单个源文件的程序,通常是将函数定义放到 main() 的后面,将函数声明放到 main() 的前面,这样就使得代码结构清晰明了,主次分明。

使用者往往只关心函数的功能和函数的调用形式,很少关心函数的实现细节,将函数定义放在最后,就是尽量屏蔽不重要的信息,凸显关键的信息。将函数声明放到 main() 的前面,在定义函数时也不用关注它们的调用顺序了,哪个函数先定义,哪个函数后定义,都无所谓了。

然而在实际开发中,往往都是几千行、上万行、百万行的代码,将这些代码都放在一个源文件中简直是灾难,不但检索麻烦,而且打开文件也很慢,所以必须将这些代码分散到多个文件中。对于多个文件的程序,通常是将函数定义放到源文件(.c文件)中,将函数的声明放到头文件(.h文件)中,使用函数时引入对应的头文件就可以,编译器会在链接阶段找到函数体。

前面我们在使用 printf()、puts()、scanf() 等函数时引入了 stdio.h 头文件,很多初学者认为 stdio.h 中包含了函数定义(也就是函数体),只要有了头文件就能运行,其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都放在了其它的源文件中,这些源文件已经提前编译好了,并以动态链接库或者静态链接库的形式存在,只有头文件没有系统库的话,在链接阶段就会报错,程序根本不能运行。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-23 08:13 , Processed in 0.034470 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表