static关键字
主要有三个作用:
1. 用static修饰的变量,与普通的全局变量一样,存储在全局数据区,系统为其分配存储内存,即使作为局部变量,也可保持其值不变;
2. 用static修饰的变量,只可作用与当前文件,即使同一工程下的其他文件,也不可访问;
3. 用static修饰的函数,同样只作用与当前文件。
关于1、2点,说白了,就是若static修饰局部变量,即修改了局部变量的生存期,可以像全局变量一样保存其值。 若修饰全局变量,则改变了其作用域,仅限于当前文件。
关于2、3点,这样做的好处就是即使不同文件起同样的名字,只要用static修饰就互不影响,可以防止不必要的错误。
若想了解详细,可参考大神文章:https://blog.csdn.net/guotianqing/article/details/79828100
举例:
· 其值可保持不变
void func1(void)
{
int i = 10;
static int j = 10;
i++;
j++;
printf("普通局部变量值为:%d, static修饰的静态变量值为:%d\n", i, j);
}
int main(int argc, char* argv[])
{
func1();
func1();
func1();
return 0;
}
运行结果:
普通局部变量值为:11, static修饰的静态变量值为:11
普通局部变量值为:11, static修饰的静态变量值为:12
普通局部变量值为:11, static修饰的静态变量值为:13
可以看出,普通局部变量每次运行其函数时都会初始化,而static修饰的局部变量就会把其值保存下来,下次运行函数时,就会拿上次的值参与运算。
· static修饰的变量仅作用于当前文件
main.c文件:
int i;
static int j;
int main(int argc, char* argv[])
{
test();
return 0;
}
test.c文件:
extern i; //extern:调用其他文件变量
extern j;
void test(void)
{
i = 12;
j = 13;
printf("i value %d, j value %d\n", i, j);
}
运行后出现报错:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2001 无法解析的外部符号 _j volatile D:\Visual studio code\C\volatile\volatile\test.obj 1
错误 LNK1120 1 个无法解析的外部命令 volatile D:\Visual studio code\C\volatile\Debug\volatile.exe 1
当取消j调用时,程序可正常运行:
extern i;
void test(void)
{
i = 12;
printf("i value %d\n", i);
}
结果:
i value 12
·static修饰函数只作用于当前文件
main.c文件:
int main(int argc, char* argv[])
{
test();
test1();
return 0;
}
test.c文件:
void test(void)
{
printf("Hello World\n");
}
static void test1(void)
{
printf("Hello Kitty\n");
}
test.h文件:
#ifndef __TEST_H
#define __TEST_H
void test(void); //用于让其他文件调用该函数
void test1(void);
#endif
运行结果:无法解析test1函数
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK1120 1 个无法解析的外部命令 volatile D:\Visual studio code\C\volatile\Debug\volatile.exe 1
错误 LNK2019 无法解析的外部符号 _test1,函数 _main 中引用了该符号 volatile D:\Visual studio code\C\volatile\volatile\main.obj 1
去掉该函数后即正常:
main.c修改:
int main(int argc, char* argv[])
{
test();
//test1();
return 0;
}
运行结果:
Hello Wolrd