c++ static详解 (三)

2014-11-24 12:03:59 · 作者: · 浏览: 2

8
9 //***************************************
10
11 #include ;
12
13 int n;
14
15 void print_n();
16
17 void main()
18
19 {
20
21 n=20;
22
23 cout< 24
25 print_n();
26
27 }
28
29
30
31 //****************************************
32
33 // exam2.cpp
34
35 //****************************************
36
37 static int n;
38
39 static void staticfn();
40
41 void print_n()
42
43 {
44
45   n++;
46
47   cout< 48
49   staticfn();
50
51 }
52
53 void staticfn()
54
55 {
56
57   cout< 58
59 }


程序运行结果如下
1. 20
2. 1
3. 1
下面我们将对上面的程序进行少量的改造,在看看执行结果如何。
改造一:
1. 将exam1.cpp的第二行int n改为extern int n,这就是告诉程序我在此处声明了变量n,但是真正的定义过程在别的文件中,此处就是exam2.cpp。但事实上exam2.cpp中仅仅声明了static int n。我们看看运行结果。vc中会通过编译,但是在进行连接时候会给
一个“变量n找不到”的错误。这说明exam1.cpp无法共享exam2.cpp中的static int n变量。
改造二:
1. 我们在exam1.cpp的第二行和第三行之间增加void staticfn();同时在第八行和第九行之间增加staticfn()的调用。再看执行结果。vc会产生一个找不到函数staticfn的错误。这说明exam1.cpp无法共享exam2.cpp中的staticfn()。
从上面的结论可以看出下面几点:
1. static解决了名字的冲突问题。使得可以在源文件中建立并使用与其它源文件甚至全局变量一样的名字而不会导致冲突的产生。这一点在很大的项目中是很有用处的。
2. 声明为静态的函数不能被其他的源文件所调用,因为它的名字只对本地文件可见,其余的文件无法获取它的名字,因此不可能进行连接。
3. 在文件作用域下声明的inline函数默认情况下认为是static类型。在文件作用域下声明的const的常量默认情况下也是static存储类型的。

摘自 Moon_Bird