C语言代码是以文件为单位来组织的,在一个源程序的所有源文件中,一个外部变量(注意不是局部变量)或者函数只能在一个源程序中定义一次,如果有重复定义的话编译器就会报错。伴随着不同源文件变量和函数之间的相互引用以及相互独立的关系,产生了extern和static关键字。
关键字static有着不寻常的历史。起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。
一、静态全局变量
一个典型的进程在内存中的布局类似于这样:
在进程运行过程中,BSS和DATA段内的数据始终存在。静态全局变量和其他全局变量的存储地点没有区别,因此还是在BSS和DATA中。但是,静态全局变量仅在定义它的源文件中有效,其他文件即使用extern声明也没法使用他。准确地说作用域是从定义之处开始,到文件结尾处结束,在定义之处前面的那些代码行也不能使用它。想要使用就得在前面再加extern ***。恶心吧?要想不恶心,很简单,直接在文件顶端定义不就得了。
二、静态局部变量
静态局部变量还是存储在静态区中,不过其范围更加局限,仅在定义这个变量的函数中可以使用。同一个源文件中的其他函数无法再使用这个变量。由于总是存储在静态区,因此函数返回之后变量不会被销毁,下次使用的时候变量值仍然存在。可以利用这个性质做计数等工作。
三、静态函数
在函数返回值前加上static关键字的函数就成为了静态函数,但这个“静态”不是指存储方式,而是限定仅在这个文件中才能访问该函数(所以又称内部函数 )。使用内部函数的好处是:不同的人编写不同的函数时,不用担心自己定义的函数,是否会与其它文件中的函数同名。一个很好的类比:可以想象为面向对象编程语言中的private函数。
最后综合下三种static的写法:
static int globalVar=1; void func(){ static int localVar=0; } static void printDebugInfo(){ printf("Hello World!"); }
在学习的时候参考了http://blog.csdn.net/keyeagle/article/details/6708077,在此表示感谢。