static和exteren都是C语言中的关键字
static是静态的意思,可以用来:
修饰局部变量
修饰全局变量
修饰函数
extern是用来声明外部变量的。
而在说明static和extern关键字的时候,我们有必要了解一下生命周期和作用域的概念
作用域(scope)是程序设计概念,通常来说,一段代码中所用到的名字所起作用并不是总是有效的,而限定这个名字的可用性的代码范围就是这个名字的作用域。
1.局部变量的作用域是变量所在的局部范围
2.全局变量的租作用域是整个项目
局部变量在大括号里定义,全局变量在大括号外定义
生命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的一个时间段。
1.局部变量的生命周期是:进入作用域创建,生命周期开始,出作用域生命周期结束
2.全局变量的生命周期:整个项目的声明周期
static修饰局部变量
不用static修饰局部变量的代码:
#include<stdio.h>
void test(void) {
int i = 0;
i++;
printf("%d ", i);
}
int main() {
for (int i = 0; i < 5; i++) {
test();
}
return 0;
}
上述代码因为每次进入循环跳转到test函数的时候,i的值都被重置为0,再加一,所以打印5个1。
用static修饰局部变量的代码:
#include<stdio.h>
void test(void) {
static int i = 0;
i++;
printf("%d ", i);
}
int main() {
for (int i = 0; i < 5; i++) {
test();
}
return 0;
}
可以看出int i=0;这段代码并没有重置i的值,这就是在其前面加上了static起到的作用
所以,再局部变量之间加上static关键字,这个局部变量在出函数的时候是不会销毁的,重新进入函数也不会重新创建变量,直接上次累计的数值继续计算。
结论:static修饰局部变量改变了变量的生命周期,使其从在局部范围的生命周期扩大至争个程序的生命周期。
使用建议:未来一个变量出了函数后,我们还想保留值,等下次进入函数继续使用,就可以在这个变量之前加入static
static修饰全局变量
extern是用来声明外部符号的,如果一个全局变量在另一个文件中定义,那么在此文件中则要使用extern进行变量的声明,然后再使用。
比如创建两个.c文件
int year = 2024;
#include<stdio.h>
extern int year;
int main() {
printf("%d\n", year);
return 0;
}
这样就能链接外部全局变量进行使用了,如果在全局变量year之前加上static会出现什么效果呢
static int year = 2024;
继续运行上述代码,结果为
从以上结果可以得出加入static之后,全局变量的作用域变小了,从以前的所有文件都可以使用变为只能在自己的源文件中使用。
结论:全局变量默认是具有外部链接属性的,在文件外部使用只要适当的声明就行了。但是在全局变量被static修饰以后,外部连接属性就变为内部链接属性,只能在自己所在的源文件内部使用了,其它源文件即使声明了,也不能正常使用。
使用建议:如果一个全局变量只希望在所在的源文件中使用,不想被其他源文件使用,就可以加上static修饰
static修饰函数
static修饰函数起到的作用和static修饰全局变量起到的作用是一样的。
int add(int x, int y) {
return x + y;
}
#include<stdio.h>
extern int add(int x, int y);
int main() {
int x = 19, y = 20;
printf("%d\n", add(x, y));
return 0;
}
可以得出结果:
而在add函数之间加上static关键字后会出现什么效果呢
static int add(int x, int y) {
return x + y;
}
结论:static修饰函数起到的作用和static修饰全局变量起到的作用是一样的。一个函数在前面加上static之后就会从外部连接属性变为内部连接属性,这样的这个函数就只能在自己的源文件中使用了,其他函数即使外部声明也不能使用。
使用建议:一个函数执行在所在的源文件中使用,而不想在其他文件中使用即可用static修饰该函数