前言
extern 和 static在C语言的学习中尤为重要,所以我们有必要掌握。
一、头文件
(1)C语言为什么要诞生头文件
在学习C语言的时候,当我们需要写一个比较大的项目的代码的时候,我们常常需要用到头文件,即以.h结尾的文件配合起来写,那为什么需要有头文件呢?我就单单的一个test.c文件就不能写出来大的项目了吗?从理论上来讲,确实可以只通过一个test.c文件写代码,但是单纯的使用源文件,组织项目结构的时候,项目越大越复杂的时候,维护成本就越高!头文件的出现大大降低了大型项目的维护成本,因为如果你在test.c文件使用了某个值100遍,但是你现在需要修改这个值,如果没有头文件,你就需要把这100个值都同时改掉,但是把它放到头文件里面,再在test.c包含头文件,那么当需要修改这个值的时候只需要在头文件修改这个值就能把test.c里面的所有这个值都改掉,大大降低了维护成本。
(2)头文件一般放什么内容
1、C头文件
2、所有变量的声明
3、所有函数的声明
4、#define , typedef , struct等等。
二、extern关键字
1、声明变量时不能设置初始值,例如extern int val=0 这种写法是错误的,因为声明的时候没有开辟空间,所以0不能赋值给val。
2、变量的声明必须带上extern,因为如果写成 int val;编译器可能把它看成是定义,而头文件不能放定义,所以这种具有二义性的代码,我们必须去避免。
3、函数的声明建议带上extern,虽然编译器看这个是函数的声明还是定义是看函数体是否有内容,但是当你带上extern的时候,代码的可读性就上来了,别人或者自己一眼就能看出这个是函数的声明了。
三、static关键字
1、全局变量可以跨文件访问吗?
可以。
2、函数可以跨文件访问吗?
可以。
3、在具体的应用场景当中,有没有可能,我们不想让全局变量或者函数跨文件访问,只在本文件内部访问?
答案是肯定的。
(1)static修饰全局变量,该变量只在本文件内被访问,不能被外部其他文件直接访问。
(2)static修饰函数, 该函数只在本文件内被访问,不能被外部其他文件直接访问。
(3)static修饰局部变量,更改局部变量的生命周期,作用域不变。
四、三个为什么
1、为什么全局变量和函数可以跨文件访问?
因为有一定规模的项目,一定是多文件的,多个文件之间,后续一定要进行数据“交互”。代码是需要模块化的,不可能全部代码都放在test.c文件中的,所以如果不能跨文件,也就说明小组写的代码不能通用,那交互成本就会变得很高。
2、为什么是局部变量?为什么局部变量被static修饰后变成了全局生命周期??
(1)、因为局部变量是在栈区开辟内存空间的,栈是动态变化的,所以具有临时性。
(2)、局部变量被static修饰之后变成了全局的生命周期的根本原因是它的存储位置发生了变化,由栈区到静态数据区,所以具有了全局生命周期,但是作用域还是不变的。