在C里面,所谓 static ,只是限制在当前源文件————这个只是对于编译器/链接器而言。
但实际上,运行时,static和普通的extern 的函数/变量,没有区别。
例如:使用函数指针/变量指针,完全可以访问其他文件的 static 变量/函数
file01.h
int * iptr01;
typedef void (* funcPtr)(void);
funcPtr pfun01;
----------------------------
file01.c
#include "file01.h"
static int ivar01 = 36;
int * iptr01 = &ivar01;
static void hwfun (void);
funcPtr pfun01 = &hwfun;
void hwfun (void)
{
printf("hello world\n");
}
-------------------------
file02.c
#include "file01.h"
............
//在某个代码内
*iptr01 = 72;
//file01.c 中的ivar01 变为72;
pfun01();
//调用了file01.c 中的hwfun ,打印出hello world
函数的定义和声明默认情况下是extern的,但静态函数只是在声明他的文件当中可见,不能被其他文件所用。
定义静态函数的好处:
<1> 其他文件中可以定义相同名字的函数,不会发生冲突
<2> 静态函数不能被其他文件所用。 存储说明符auto,register,extern,static,对应两种存储期:自动存储期和静态存储期。 auto和register对应自动存储期。具有自动存储期的变量在进入声明该变量的程序块时被建立,它在该程序块活动时存在,退出该程序块时撤销。