第12章 C语言中用户标识符的作文域和存储类 12.3 全局变量及其作用域和生存期
讨论本章
- 知识点:
- 全局变量的作用域和生存期
- 在同一编译单位内用extern说明符扩展全局变量的作用域
- 在不同编译单位内用extern说明符扩展全局变量的作用域
- 静态全局变量
全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止。
在同一编译单位内用extern说明符扩展全局变量的作用域
当全局变量定义在后,引用它的函数在前时,应该在引用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需再为它另外开辟存储单元。这时其作用域从extern说明处起,延伸到该函数末尾。
注意:全局变量的说明与全局变量的定义不同:变量的定义(开辟存储单元)只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说明,则可以多次出现在需要的地 方,这时必须用extern进行说明。
在不同编译单位内用extern说明符扩展全局变量的作用域
在实际应用中,一个c程序通常由许多函数组成,这些函数可以分别存放在不同的源文件中,每个源文件可以单独进行编译,进行语法检查,若无错误即生成目标文件(.obj),然后可用系统提供的连接程序把多个目标文件连接成一个可执行程序(.exe),此程序就可执行。通常,人们把每个可进行单独编译的源文件称为“编译单位”。
当一个程序由多个编译单位组成,并且在每个文件中均需要引用同一个全局变量,这时若在每个文件中都定义了一个所需的同名全局变量,则在“连接”时将会产生“重复定义”错误。在这种情况下,单独编译每个文件时并无异常,编译程序将按定义分别为它们开辟存储空间,而当进行连接时,就会显示出错信息,指出同一个变量名进行了重复定义。解决的办法通常是:在其中一个文件中定义所有全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译单位中定义,通知编译程序不必再为它们开辟存储单元。
当用static说明符说明全局变量时,此变量可称作“静态”全局变量。静态全局变量只限于本编译单位使用,不能被其他编译单位所引用。