函数:static和extern
0.前言
在正式开始之前先说作用域和生命周期
作用域:
作用域有分为局部变量和全局变量
局部变量:一个变量仅在其中一段代码内起作用
全局变量:所有的代码都可以使用这个变量
生命周期:
生命周期是一个代码从运行开始到结束为一个生命周期,局部变量的生命周期为作用域开始到局部的作用域结束,全局变数的生命周期为整个代码的开始到结束
1.extern
extern是专门用来声明外部符号的
如果没有使用extern,想要使用外部符号运行时会报错
2.static
static可以用来修饰:
局部变量
全局变量
函数
2-1修饰局部变量
我们先写一段代码:
void test()
{
int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int a = 0;
for (a = 0; a <= 10; a++)
{
test();
}
return 0;
}
这段代码当我运行时,会打印出10个2,因为当进入void test运行时,其作用域只在void test里运行,出了作用域生命周期结束,自然只出现10个2
这次我们加上static
void test()
{
static int a = 1;
a++;
printf("%d ", a);
}
int main()
{
int a = 0;
for (a = 0; a <= 10; a++)
{
test();
}
return 0;
}
则会打印数字2到12
至于为啥会这样是因为经过static修饰过后局部的变量从栈区储存到了静态区,变得跟程序生命周期一样长,只要代码运行结束变量才销毁,内存回收,但作用域是不变的
2-2修饰全局变量
再来写一段代码:
add.c:
int a = 5000;
test.c
extern int a;
void test()
{
printf("%d\n", a);
}
int main()
{
test();
printf("%d\n", a);
return 0;
}
如果再add.c里加上static呢?
static int a = 5000;
会直接报错
当static去修饰全局变量时那个全局变量只能在那个文件内使用,函数同理
2-3修饰函数
在来一段代码:
add.c
int test(int x, int y)
{
return x * y;
}
test.c
int main()
{
int a = 0;
int b = 0;
scanf_s("%d%d", &a, &b);
int c = test(a,b);
printf("%d", c);
return 0;
}
以上代码运行都没有任何问题,但是add.c加上static会发生什么事呢?
static int test(int x, int y)
{
return x * y;
}
会直接报错,和修饰全局变量的结果一样
制作不易,赏个赞吧!