3.6 指定存储空间分配

创建一个变量时,我们拥有指定变量生存期的很多选择,指定怎样给变量分配存储空间,以及指定编译器怎样处理这些变量。

3.6.1 全局变量

全局变量是在所有函数体的外部定义的,程序的所有部分(甚至其他文件中的代码)都可以使用。全局变量不受作用域的影响,总是可用的(也就是说,全局变量的生命期一直到程序的结束)。如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这个数据。例如:

3.6 指定存储空间分配 - 图1

3.6 指定存储空间分配 - 图2

下面的程序把globe作为一个外部变量来访问:

3.6 指定存储空间分配 - 图3

变量globe的存储空间是由程序Global.cpp中的定义创建的,在Global2.cpp的代码中可以访问同一个变量。由于Global2.cpp和Global.cpp的代码是分段编译的,必须通过声明:

3.6 指定存储空间分配 - 图4

告诉编译器变量存在哪里。

运行这个程序时,会看到函数func()的调用的确影响globe的全局实例。

在Global.cpp中,可能看到下面这个特殊的注释标记(这是我自己的设计):

3.6 指定存储空间分配 - 图5

这是说要创建最后的程序,带有Global2名字的目标文件必须被连接进来(这里没有扩展名是因为目标文件的扩展名在不同的系统中是不一样的)。在Global2.cpp中,第一行有另一个特殊的注释标记{O},意思是“不要从这个文件生成可执行文件,编译它是为了把它连接进一些其他的可执行文件中。”本书第2卷中的ExtractCode.cpp程序(在www.BruceEckel.com上可以下载)阅读这些标记并生成适当的makefile使得每一个文件被正确地编译(在本章结束时将会了解makefile)。