一:static
static有两种使用:一种是修饰变量,另一种是修饰函数
1.修饰变量:作用是使得该变量在出了其作用范围后不会被销毁
第一种是修饰局部变量:
普通的局部变量是存储在栈区的,但是通过static修饰之后就会存储在静态区上,出了他的作用域之后该变量不会被销毁,通常用于一些实现一些具有记忆性的代码功能,例如strtok函数(可以去百度搜一搜strtok函数的特性)。
下面是例子:
#include<stdio.h>
void fun()
{
static int i = 0;
i++;
printf("%d ", i);
}
int main()
{
for (int i = 0; i < 10; i++)
fun();
}
上面代码的输出结果就是1~11.
第二种就是修饰全局变量,被static修饰的全局变量也有着不会因为出了作用于而被销毁的功能,其会存储在静态区的全局变量区,被static修饰的全局变量与普通的全局变量的区别就是不能在其他的文件中使用(就是不能再用extern来在别的文件中使用这个全局变量)
2.修饰函数:
修饰函数的作用也是跟修饰全局变量的作用差不多,就是不能通过引用来在别的文件中使用这个函数。
二:extern
extern的作用就是声明变量或者声明函数,然后能在别的文件中使用这个全局变量或者函数。
例如:在exterm.c 文件中定义全局变量 int k=10;然后:
#include<stdio.h>
extern int k;//声明
int main()
{
printf("%d", k);
}
打印的结果是10.
同理声明函数也可以:
extern void fun();
但是要注意的是:extern修饰函数的时候extern是可以省略的,但是修饰全局变量的时候是不能省略的,不然就会出现重定义情况(下面具体分析)
假设我已经在一个叫做extern.c 的文件中定义了全局变量k,然后在test.c中有如下代码:
int k = 0;
int main()
{
printf("%d", k);
}
那么编译器就会报错(vs2019环境下):
但是如果如下代码就不会出错:
int main()
{
int k = 0;
printf("%d", k);
}
因为这里的k是局部变量,c语言是允许局部变量和全局变量拥有同一个名字的,但是在局部变量的作用域之内局部变量有先,所以如上的代码结果就是0,而不是另一个文件中定义的10。
全局变量是不允许同名的,即使实在不同的文件中定义的。
综上extern的作用就是声明,可以声明函数也可以声明变量,使其能够在不同的文件中使用。
三:extern和static
extern和static两者之间是有一种相克的关系:用了extern的不能用static,用了static的不能用extern,extern是声明让别的文件中能够使用,static修饰之后的函数或全局变量不能被其他文件使用。