在C语言中,static的字面意思很容易把我们导入歧途,其实作用有三条:
(1)第一条也是最重要的一条:隐藏
当我们同事编译多个文件时,所有未加static前缀的全局变量和函数都具有全局可见性,举例来说:同时编译2个源文件:a.c和main.c
下面是a.c的内容
int msg()
{
printf( " Hello\n " );
}
下面是main.c的内容
{
extern char a; // extern variable must be declared before use
printf( " %c " , a);
msg();
return 0 ;
}
程序的运行结果是:
A Hello
这个结果不难理解,因为使用了声明extern。
但是如果在a中增加static,那么就会将其隐藏,main.c就看不到a和msg函数了,那么问题来了,为什么要使用static呢,其实利用这一特性,可以在不同的文件中定义同名函数和同名变量,只需要添加static即可,这一就不比担心命名的冲突了,总的来讲,此处static的作用仅限于隐藏。
(2)static的第二个作用是保持变量内容的持久,存储在静态数据区的变量会在程序开始运行时就完成初始化,这也是唯一的一次初始化,共有2种变量存储在静态存储区:全局变量和static变量,只不过和全局变量比起来,static可以控制变量的可见范围,所到底static还是用来隐藏的。举例如下:
#include <stdio.h>
int fun(void){
static int count = 10; // 事实上此赋值语句从来没有执行过
return count--;
}
int count = 1;
int main(void)
{
printf("global\t\tlocal static\n");
for(; count <= 10; ++count)
printf("%d\t\t%d\n", count, fun());
return 0;
}
程序运行结果:
通过这个运行结果,就可以发现,所到底static还是用来隐藏的。
(3)static的第三个作用就是默认初始化为0,其实全局变量也具备这一属性,因为全局变量也存储在静态数据区,在静态数据区,内存中的所有字节默认值都是0x00,这一特点可以减少程序员的工作量。
最后,总结static的作用:首先static的最主要功能是隐藏,其次因为static变量存放在静态存储区,所以它具备持久性和默认值0.