C语言学习第007课——函数和多文件编程

函数的概念

  • 函数分类
    系统函数,即库函数,是由编译系统提供的,用户不必自己定义这些函数,可以直接使用他们,如我们常用的打印函数printf()
    用户定义函数,用以解决用户的专门需要

  • 函数的作用
    省去重复代码的编写,降低代码重复率

  • 函数的定义

    返回值类型 函数名(参数列表)
    {
           
    	代码体
    	return 0;
    }
    
  • 函数的使用
    在不同函数中的变量名可以重名,因为作用域不同
    函数定义中参数称为形参,也就是形式参数,没有具体的值
    函数调用过程中传递的参数称为实参,实际参数,有具体的值
    在函数调用结束之后,函数会在内存中销毁,在栈区自动销毁,函数中使用过的形参也会从内存中销毁。

形参和实参

形参出现在函数定义中,在整个函数体内都可以使用,离开该函数则不能使用。
实参出现在主调函数中,进入被调函数后,实参也不能使用。
实参变量对形参变量的数据传递是“值传递”,即单向传递,只由实参传给形参,而不能从形参传给实参
在调用函数时,编译系统临时给形参分配存储单元,调用结束后,形参单元被释放
实参单元与形参单元是不同的单元,调用结束后,形参单元被释放,函数调用结束返回主调函数后则不能再使用该形参变量。实参单元仍保留并维持原值
因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数中实参的值。

函数的声明

函数的使用分为三个步骤:
1 函数声明
2 函数定义
3 函数调用
为什么有时候不用声明呢?这是因为被调函数定义在了主函数main()之前,这种情况下,不用声明也可以调用函数
如果被调函数定义在了主函数main之后,则需要进行函数声明操作,意在告诉主函数,没事,你调用吧,我会在后面定义这个函数的
在一个工程/项目中,函数的名字是唯一的,而且也是共用的,就是在一个文件中定义函数,在另一个文件中可以直接调用
函数声明可以多次,调用也可以多次,但是定义只可以一次。
在a.c文件中定义的方法a(),在b.c文件中需要调用方法a()的话,也需要在b.c文件中声明一下,告诉b.c我这个方法在外部声明过了,放心调用吧
函数声明时,extern关键字可以省略,形参名称也可以省略,留有形参类型就行了
声明函数的三种方式:

extern int add(int a,int b);
int add(int a,int b);
int add(int,int);

而变量的声明和函数的声明不一样,变量声明不会分配内存空间,定义变量的时候才会分配内存空间并赋值,可以说定义变量包括了声明变量和分配内存空间,赋值,所以说定义是声明,而声明不是定义

main()函数和exit()函数

main函数是主函数,是程序的入口,main函数执行到最后一个大括号,代表程序结束,
在main函数中return任意整数,也代表程序结束,程序就此结束,return语句后面的代码都不会执行
在非main函数中,return语句代表函数的返回值,而在非main函数中执行exit函数也可以直接使程序结束,exit后面的所有代码都不会执行
exit函数代表结束程序,无论在哪里调用都会直接结束程序,和main函数中的return一样的效果。

多文件编程

示例:
func.c文件代码:

int max(int a, int b){
     
	return a>b?a:b;
}

head.h文件代码

extern int max(int a,int b);

main.c文件代码

#include 
#include "head.h"
int main(void){
     
	int a = 10;
	int b = 20;
	int c = max(a,b);
	printf("max = %d\n",c);
}

以上示例了多文件编程整个过程,将函数max()定义一个func.c文件中,将之声明在一个头文件head.h中,然后再main函数中引入头文件head.h就可以直接调用max()函数

防止头文件重复包含

当项目中头文件比较多的时候,经常会在一个头文件中导入另一个头文件,但是如果写的时候忘记了,发生你导入我,我导入你的情况,程序就会一直无限循环的导入这两个头文件,发生报错,解决此问题有两种办法:

  • 办法一:
    在头文件第一行添加

    #pragma once
    

    意思是防止头文件重复包含
    但是此种办法只适用于windows系统,不适用与Linux系统

  • 办法二:
    使用:

    #ifndef XXX
    #define XXX
    .....声明语句
    #endif
    

    在定义头文件时,经常会一个.c文件,对应一个.h文件,例如上面功能的代码常常会这样定义头文件

    func.c

    
    
    int max(int a, int b){
           
    	return a>b?a:b;
    }
    
    

    func.h

    #ifndef __FUNC_H__//常用定义方法 
    #define __FUNC_H__
    
    int max(int a, int b);
    
    #endif
    

    main.c

    #include 
    #include "func.h"
    int main(void){
           
    	int a = 10;
    	int b = 20;
    	int c = max(a,b);
    	printf("max = %d\n",c);
    }
    

你可能感兴趣的:(C语言基础,c语言)