C语言函数声明以及函数原型超详细讲解示例

作者:Elanie1024 时间:2023-03-31 03:12:02 

C语言代码由上到下依次执行,原则上函数定义要出现在函数调用之前,否则就会报错。但在实际开发中,经常会在函数定义之前使用它们,这个时候就需要提前声明。

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

函数声明的格式非常简单,相当于去掉函数定义中的函数体,并在最后加上分号;,如下所示:

dataType functionName( dataType1 param1, dataType2 param2 ... );

也可以不写形参,只写数据类型:

dataType functionName( dataType1, dataType2 ... );

函数声明给出了函数名、返回值类型、参数列表(重点是参数类型)等与该函数有关的信息,称为函数原型(Function Prototype)。函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

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

【实例1】定义一个函数 sum(),计算从 m 加到 n 的和,并将 sum() 的定义放到 main() 后面。

#include<stdio.h>
//函数声明
intsum(int m,int n);//也可以写作int sum(int, int);
intmain(){
int begin =5, end =86;
int result =sum(begin, end);
printf("The sum from %d to %d is %d\n", begin, end, result);
return0;
}
//函数定义
intsum(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>
// 函数声明部分
longfactorial(int n);//也可以写作 long factorial(int);
longsum(long n);//也可以写作 long sum(long);
intmain(){
printf("1!+2!+...+9!+10! = %ld\n",sum(10));
return0;
}
//函数定义部分
//求阶乘
longfactorial(int n){
int i;
long result=1;
for(i=1; i<=n; i++){
       result *= i;
}
return result;
}
// 求累加的和
longsum(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文件)中,使用函数时引入对应的头文件就可以,编译器会在链接阶段找到函数体。

来源:https://blog.csdn.net/Elanie1024/article/details/128769662

标签:C语言,函数声明,函数原型
0
投稿

猜你喜欢

  • 细品Java8中hashCode方法的使用

    2023-10-04 14:01:19
  • Android实现输入法弹出时把布局顶上去和登录按钮顶上去的解决方法

    2022-11-10 15:07:26
  • Android自定义View圆形图片控件代码详解

    2022-05-15 12:00:53
  • RocketMQ源码分析之Broker过期消息清理机制

    2023-06-10 15:47:43
  • Java多个版本切换的几种方法

    2022-04-22 14:10:15
  • unity 如何修改材质属性和更换shader

    2023-02-22 12:42:44
  • 如何把本地jar包导入maven并pom添加依赖

    2021-12-31 04:11:28
  • C# IP地址与整数之间转换的具体方法

    2023-06-20 13:33:25
  • Android编程实现的手写板和涂鸦功能

    2022-01-04 19:20:52
  • java计算给定字符串中出现次数最多的字母和该字母出现次数的方法

    2022-01-13 03:00:04
  • java实现列表、集合与数组之间转化的方法

    2023-11-29 10:17:38
  • Android 实现可任意拖动的悬浮窗功能(类似悬浮球)

    2023-08-07 10:19:05
  • spring data jpa使用详解(推荐)

    2022-06-19 05:22:17
  • java10下编译lombok注解代码分享

    2023-06-06 11:02:35
  • c#测试反射性能示例

    2021-12-19 23:13:47
  • Java 如何将表格数据导入word文档中

    2023-08-13 10:38:55
  • 浅析Java中Split函数的用法技巧

    2023-02-19 09:13:27
  • C++多重继承与虚继承分析

    2023-04-22 14:49:16
  • Java编程Nashorn实例代码

    2022-07-30 05:28:21
  • spring cloud整合ribbon问题及解决方案

    2023-07-25 04:24:49
  • asp之家 软件编程 m.aspxhome.com