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

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

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

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

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

dataType  functionName( dataType1, dataType2 ... );

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

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

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

#include

//函数声明

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

// 函数声明部分

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 中包含了函数定义(也就是函数体),只要有了头文件就能运行,其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都放在了其它的源文件中,这些源文件已经提前编译好了,并以动态链接库或者静态链接库的形式存在,只有头文件没有系统库的话,在链接阶段就会报错,程序根本不能运行。

关于编译链接的原理,以及如果将代码分散到多个文件中,我们将在《C语言多文件编程》专题中详细讲解。

除了函数,变量也有定义和声明之分。实际开发过程中,变量定义需要放在源文件(.c文件)中,变量声明需要放在头文件(.h文件)中,在链接程序时会将它们对应起来,这些我们也将在《C语言多文件编程》专题中详细讲解。

学完《C语言多文件编程》,你对C语言的认识将会有质的提升,瞬间豁然开朗,轻松超越 90% 的C语言程序员。

函数参考手册

最后再补充一点,函数原型给出了使用该函数的所有细节,当我们不知道如何使用某个函数时,需要查找的是它的原型,而不是它的定义,我们往往不关心它的实现。

www.cplusplus.com 是一个非常给力的网站,它提供了所有C语言标准函数的原型,并给出了详细的介绍和使用示例,可以作为一部权威的参考手册。

c语言函数原型语句,C语言函数声明以及函数原型相关推荐

  1. c语言printf输出语句_C语言中另一个printf()语句中的printf()语句

    c语言printf输出语句 A printf() function is a standard library function, that is used to print the text and ...

  2. c语言入门for语句,c语言for语句

    首先呢 for语句是由4部分组成 for(表达式1;表达式2;表达式3) 循环体: 注意 1:循环中的表达式用;隔开 表达式1通常用来呢赋初值 表达式2通常用来循环控制也就是循环条件 表达式3通常就是 ...

  3. c语言输入循环语句,C语言中输入输出和循环语句详解.ppt

    C语言中输入输出和循环语句详解 C语言的输入输和循环分支语句详解 本章主要向大家介绍下C语言的输入和输出功能以及循环分支语句的使用 第4章 顺序结构程序设计 3.1 C语言语句 3.2 赋值语句 3. ...

  4. c语言程序终止语句,c语言的语句以什么结束

    本文收集整理关于c语言的语句以什么结束的相关议题,使用内容导航快速到达. 内容导航: Q1:C语言结束语句 加个头文件,放到最前面 就可以编译啦 #include #include Q2:c语言阅读赋 ...

  5. 分段函数if语句_C语言函数系列之库函数中基础必会函数(一)

    !!!阅前提醒:!!! 此文为c语言函数系列的第一篇,全系列字数将达到1w字以上且全为干货内容,请各位仔细阅读并打开编译器运行文章中出现的代码进行试验以确保能理解文章内容 if判断函数(以图中显示代码 ...

  6. c语言switch scanf语句,c语言switch语句 谢谢·!~!~

    c语言switch语句 谢谢·!~!~以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言switch语句 谢谢·!~ ...

  7. c语言while嵌套循环语句,C语言 while 循环嵌套-嗨客网

    C语言while循环嵌套教程 C语言while循环嵌套详解 语法 while (cond1) { // do something while (cond2) { // do something whi ...

  8. c语言 switch循环语句,C语言入门(四)之switch、循环语句

    switch格式 switch格式: switch (条件表达式) { case 整数: // case可以有一个或多个 语句; break; case 整数: // case可以有一个或多个 语句; ...

  9. c语言解析sql语句_C语言中嵌入式SQL语句

    实验内容: 掌握SQL Server 2000的预编译程序NSQLPREP.EXE的使用(以课本例题1进行调试): 实验步骤: 一.数据库环境配置 1.创建xuesheng数据库,建立student表 ...

最新文章

  1. scala构建工具sbt使用介绍
  2. jpa 查找最后一条数据_查找数据的最后1条记录,你用了2小时,同事1分钟就搞定了...
  3. 全球及中国甲醇催化剂行业前景动态与市场需求调研报告2022版
  4. C#借助API实现黑盒自动化测试工具的编写
  5. winrar 无法设置 xxx.aspx 的安全数据 -- 用批处理压缩文件在user账号下解压缩发生的错误...
  6. STM32F103ZET6 GPIO的使用
  7. 深度优先遍历(DFS)- Letter CasePermutation - Combinations
  8. 190615每日一句;每个学生都不能错过的9个人生忠告; 什么样心态的人,才能取得最终的成功
  9. oracle _db_block_write_batch,Oracle体系结构----实例的进程结构
  10. 将Grub2安装到其他硬盘分区
  11. 不同的智能门锁解决方案开锁方式
  12. 【优化求解】狼群优化算法matlab源码
  13. mac系统我的世界服务器,我的世界Mac版联机教程
  14. Codeforces Round #700 (Div. 2)-B. The Great Hero-题解-一行实现向上取整
  15. js下载文件 阿星小栈
  16. 简单的视频剪辑入门制作软件,适合新手哦,快快收藏
  17. chatgpt在中国怎么使用
  18. 析构函数什么时候会调用?
  19. 【认证】数字电视高清认证情况及关键技术指标
  20. 小学四年级计算机上册考试试题,小学四年级数学上册复习试题

热门文章

  1. Pearson相关系数矩阵解释
  2. OKhttp Rejecting re-init on previously-failed class Failed resolution of: Lorg/conscrypt/Conscrypt
  3. oracle中or的使用,Oracle Or
  4. CSDN上查看已关注的博客专栏
  5. Redisson信号量
  6. 手机屏幕用户点击划线区域热力图
  7. python安装annoy
  8. 英语流利说第四季度净亏损1.57亿元 同比增加
  9. 真的都是黑幕么?普通学生考研还有机会逆袭么?
  10. 计算机病毒的危害及常用处理方法,几种常见恶性电脑病毒清除方法