通俗易懂说static
1. static关键字有三个作用
1.1 作用1:隐藏
因为所有未加static修饰的函数、变量都具有全局可见性,即其他文件可见,可用;
加了static修饰后,修饰的函数、变量就会对其他源文件隐藏,就只能在本文件内被访问了。
利用这一作用可以在不同文件中定义同名函数或变量,而不必担心命名冲突。
1.1.1 项目中使用 static
项目中一般将只在本文件中使用的函数 前面用static 修饰,并且下划线+小写字母表示接口,如:
// add.c
static _xxx_yyy_addTwoNum()
{
……
}
//说明这个接口只在本文件 add.c 中使用,其他文件不可见
1.1.2 全局变量如何被其他文件使用 - extern
1.对变量而言:
1. 因为全局变量不能在头文件中定义,如果定义会导致各个.c文件包含的这个头文件重复定义;
2. 全局变量可以再.c中定义,只要在.h中声明即可,那么如何声明呢?
加了extern就是声明;
如果没有extern关键字,就是定义;
参考:
extern 关键字说明
https://blog.csdn.net/lqy971966/article/details/118017369
2.对于函数而言:
1. 函数可以再头文件中声明,加与不加extern都是一样的意思。都是声明。
1.2. 作用2:保持变量内容持久
对于变量来说,第二个作用就是保持变量内容持久。
就是说,第一次初始化分配内存后,就算函数或者代码块执行完毕,
该变量也不会被回收销毁,直到程序结束 static 变量才会被回收。
1.3. 作用3:初始化为0
对于变量来说,第三个作用就是变量初始化为0,存储在静态存储区。
2. static静态全局变量
- static静态全局变量,函数,只在当前文件可见,其他文件不可见
- static静态全局变量与其他全局变量的区别:是否其他文件可见
3. static静态局部变量
static静态局部变量与其他局部变量的区别:
- 生命周期: static静态局部变量虽然是局部的,但是它存在于程序的整个生命周期
- 访问权限: 虽然存在于整个生命周期,但是只能被当前函数访问
- 初始化:默认初始化为0
- 值:以后每次调用都是上次修改的值,因为其存储在全局存储区
4. 举例:
#include <stdio.h>
//未加static 修饰
void func(void)
{
int iTmp = 1;
printf("func iTmp =%d\n", iTmp );
iTmp ++;
}
//加static 修饰
void func_static(void)
{
static int iTmp = 1;
printf("func_static iTmp =%d\n", iTmp );
iTmp ++;
}
int main(void)
{
printf("-----------first print ----------\n");
func();
func_static();
printf("--------second print------------\n");
func();
func_static();
printf("--------------end--------------\n");
return 0;
}
**结果:**
--------first print ------------
func iTmp = 1
func_static iTmp = 1
--------second print------------
func iTmp = 1
func_static iTmp = 2
--------------end--------------