c语言中用户标识符的作用域跟存储类(3)
3 全局变量及其作用域和生存期
全局变量只有静态一种类别。对于全局变量可使用extern和static两种说明符。
3.1全局变量的作用域和生存期
全局变量是在函数外部任意位置上定义的变量,它的作用域是从变量定义的位置开始,到整个源文件结束止。
全局变量的使用相当于为函数之间的数据传递另外开辟了一条通道。全局变量的生存期是整个程序的运行期间。若全局变量和某个函数中的局部变量同名,则在该函数中,此全局变量被屏蔽,在该函数内访问的是局部变量,与同名的全局变量不发生任何关系。
虽然全局变量作用域较大,生存期长,用起来似乎方便灵活,但需要注意的是:除十分必要外,一般不提倡使用全局变量,原因主要有以下三方面:
(1)不论是否需要,全局变量在整个程序运行期间都占用内存空间;
(2)全局变量必须在函数以外定义,降低了函数的通用性,影响了 函数的独立性。
(3)使用全局变量容易因疏忽或使用不当而导致全局变量中的值意外改变,产生难以查找的错误。
3.2 在同一编译单位内用extern说明符扩展全局变量的作用域
当全局变量定义在后,饮用它的函数在前时,应该在饮用它的函数中用extern对此全局变量进行说明,以便通知编译程序:该变量是一个已在外部定义了的全局变量,已经分配了存储单元,不需再为它另外开辟存储单元。这时其作用域从extern说明处起,延伸到该函数的末尾。
注意:全局变量的说明与全局变量的定义不同。变量的定义(开辟存储单元)只能出现一次,在定义全局变量时,不可使用extern说明符;而对全局变量的说明,则可以多次出现在需要的地方,这时必须用extern进行说明。
int x, y; /*定义全局变量的格式*/
extern int x, y; /*说明全局变量的格式*/
3.3 在不同编译单位内用extern说明符扩展全局变量的作用域
实际应用中,一个c程序通常由许多函数组成,这些函数可以分别存放在不同的源文件中,每个源文件可以单独进行编译,进行语法检查,若无错误即生成目标文件(.obj),然后可用系统提供的链接程序把多个目标文件链接成一个可执行程序(.exe)。通常把每个可进行单独编译的源文件成为“编译单位”。
当一个程序由多个编译单位组成,并且在每个文件中均需要饮用同一个全局变量,这时若在每个文件中都定义一个所需的同名全局变量,则在“链接”时将会产生“重复定义”错误。这种情况下,单独编译每个文件时并无异常,编译程序将按定义分别为它们开辟存储空间,而当进行连接时,就会显示错误信息,指出同一变量名进行了重复定义。
解决上述问题的办法通常是:在其中一个文件中定义所有全局变量,而在其他用到这些全局变量的文件中用extern对这些变量进行说明,声明这些变量已在其他编译单位中定义,通知编译程序不必再为它们开辟存储单元。
3.4 静态全局变量
当用static说明符说明全局变量时,此变量可称为“静态”全局变量。静态全局变量只限于本编译单位,不能被其他编译单位所引用。static说明限制了全局变量作用域的扩展,达到了信息隐蔽的目的。这对于编写一个具有众多编译单位的大型程序是十分有益的,程序员不必担心因全局变量重名而引起混乱。