static和extern是两种可以全局作用的变量。
在这里,先说明“声明”和“定义”的区别。如果是定义,那么编译器会为该分量分配内存空间,但是对于声明来说则不会分配。
静态变量的定义是伴随着声明的,也就是说不管在声明的时候有没有对变量进行初始化,静态变量都会进行初始化,缺省值为0;然而外部变量的声明和定义是分开的,并且可以在多个文件中多次声明同一个变量(要注意,外部变量的定义一定要在函数体外进行)。
ps:当int a放在外部时,它表示的是外部变量而不是静态变量,并且会被默认初始化为0,同静态变量。若无extern,则表示该变量的定义,加了extern则仅仅是声明,不分配内存。
ps:外部和静态变量都只会被初始化一次,而自动变量和寄存器变量每次进入函数都会被重新初始化一次。
基本的区别也就这样,以下说明一下全局静态变量和局部静态变量。
对于局部静态变量,它的作用域在函数块内,块外不能访问,但是生命周期直到整个程序的结束(个人认为静态局部变量的好处在于避免了放在块外被不小心修改的可能)。而全局静态变量,它的作用域在于整个文件的结束,这里再提一下和extern的区别,extern在整个程序中都可以被访问,只要在所在的文件内重新声明即可使用,而全局静态变量只局限在自己的文件内。