C语言函数的声明以及函数原型

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

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

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

返回值类型  函数名( 类型 形参, 类型 形参… );

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

返回值类型  函数名( 类型, 类型…);

函数声明给出了函数名、返回值类型、参数列表(参数类型)等与该函数有关的信息,称为 函数原型( Function Prototype

函数原型的作用是告诉编译器与该函数有关的信息,让编译器知道函数的存在,以及存在的形式,即使函数暂时没有定义,编译器也知道如何使用它。

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

上节给出了计算 sum = 1! + 2! + 3! + ... + (n-1)! + n!的代码,这节我们稍作修改,将 factorial() 和 sum() 函数的定义放到 main() 函数后面,请看下面的代码:
   
   
  1. #include <stdio.h>
  2.  
  3. // 函数声明
  4. long factorial(int n); //也可以写作 long factorial(int);
  5. long sum(long n); //也可以写作 long sum(long);
  6.  
  7. int main(){
  8. printf("1!+2!+...+9!+10! = %ld\n", sum(10));
  9. return 0;
  10. }
  11.  
  12. //求阶乘
  13. long factorial(int n){
  14. int i;
  15. long result=1;
  16. for(i=1; i<=n; i++){
  17. result *= i;
  18. }
  19. return result;
  20. }
  21.  
  22. // 求累加的和
  23. long sum(long n){
  24. int i;
  25. long result = 0;
  26. for(i=1; i<=n; i++){
  27. //嵌套调用
  28. result += factorial(i);
  29. }
  30. return result;
  31. }
#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

我们知道,使用 printf()、puts()、scanf()、getchar() 等函数要引入 stdio.h 这个头文件,很多初学者认为 stdio.h 中包含了函数定义(也就是函数体),只要有了头文件程序就能运行。其实不然,头文件中包含的都是函数声明,而不是函数定义,函数定义都在系统库中,只有头文件没有系统库在链接时就会报错,程序根本不能运行。

关于系统库以及编译链接的原理,我们将在《 C语言模块化开发》专题中详细讲解。

除了函数,变量也有定义和声明之分,我们将在《 从extern关键字开始谈C语言多文件编程》一节中深入讨论。

最后再补充一点,函数原型给出了使用该函数的所有细节,当我们不知道如何使用某个函数时,需要查找的是它的原型,而不是它的定义,我们往往不关心它的实现。
  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值