以下为测试环境:
gcc 4.3.2-1-1
GNU/Linux Debian 5.0
(刚开始使用csdn博客,没经验。由于中间调试时间较长,忘了备份,刚写完,赶紧发了。一看,没有;再看,还是没有。挥去愤怒,重写一篇。望读者以此为鉴,及时备份。:-)
1、extern与static
extern 对变量、函数声明;编译时可见,即告诉编译器:“老兄,虽然这个文件里,我没有定义,但在别处定义了,你得放过我”。而出于检查和使用的需要,没有定义是不能放行的。
函数和变量都默认为extern的,在链接时所有文件可见;更甚的是默认为不加static和extern即为定义,这也就带来的extern显性声明的必然性。这将在后面详细分析。
static,字面意思是静态限定符,用于三种场合可产生三种效果:
a、作用于局部变量,在函数的生存期其值具有连续性,如何理解,通俗但不准确的表达:被初始化一次,以后每次调用该函数时继续上次的结果。譬如:
1 #include <stdio.h>
2
3 #define COUNT 3
4 static stat_count = COUNT - 1;
5 int stat()
6 {
7 static count = COUNT;
8
9 count --;
10 printf("the result in N.O. %d invacation : %d./n", stat_count, count);
11 return count;
12 }
13 int main()
14 {
15 while(stat())
16 stat_count --;
17 return 0;
18 }
the result in N.O. 2 invacation : 2.
the result in N.O. 1 invacation : 1.
the result in N.O. 0 invacation : 0.
b、作用于全局变量,只在本文件作用,其相对的是extern。具体比较将在后面分析。
c、作用于函数,仅供本文件其它函数调用,函数和变量都默认为extern。不是本文重点,不作具体分析。
抽象点,具有三个作用:
隐藏全局可见性;