关键字
- 一.声明的关键词—extern
- 二.最名不符实的关键字—static
一.声明的关键词—extern
首先这里问两个问题
1.变量可以跨文件访问吗?
2.函数可以跨文件访问吗?
答案是都可以
那么什么是跨文件呢?
我在game.c里定义show函数,但在test.c里依然可以调用
那么变量呢
很明显这里是不能够直接调用的,那么我们可不可以调用呢?
extern这个关键词就是提供声明的,既然是声明那么我们可不可以给它赋值呢?
这里很明显是不能的。声明并没有开辟空间,而=100是赋值或者初始化必须开辟空间,很明显是不能够的
故所有的变量在声明时不能设置初始值
这里我们可以看到声明有点多了,那我们就在建一个新源文件来存放声明
我们将所有声明和头文件放入test.h中,这样是不是更简洁呢,这在项目中是尤为重要的,可以看出当代码数量越多,这种方式就越有利
需要说明的是之前的show函数没有声明也可以使用,是因为编译器会自动将定义认为声明,但这种习惯并不好,所以我们遇到函数和变量都进行声明
ps:为什么编译器不把变量的定义看作声明呢,其实很简单,像是int a;如果你不加extern,那么编译器怎么知道你是在定义还是声明呢?(注意我们这里所说的都是跨文件使用变量和函数,如果在一个文件里可以看看以下博客)
函数变量的声明
二.最名不符实的关键字—static
从上可以看出,我们定义的全局变量和函数可以在所有文件中被访问,如果我们不想让它被所有文件访问,而仅仅让这一个文件中被访问,该怎么办呢?
那么得使用static啦
这样的话那么在test.c文件中就没有a这个变量了,那么再去调用自然就会出错啦
以上是static的第一个功能
接下来介绍第二个功能
这里就很明显了使用static修饰局部变量后,编译器不会销毁i,而是继续保存
结论
1.static修饰全局变量和函数时,只能在本文件内访问,不能直接跨文件访问
2.static修饰局部变量修改其生命周期(也就是将其变为全局变量的生命周期,在全局内不会被销毁)
ps:这只是在生命周期的角度(不会被销毁),但依然不能像全局变量那样在这个文件中随意使用。