您的位置:首页 > 编程语言 > C语言/C++

C/C++全局变量

2016-03-24 22:18 357 查看
在以后学习的过程中会逐步完善对全局变量的理解

全局变量

全局变量就是在函数外面定义的变量。通常全局变量的作用域为其定义位置开始,至文件结尾,也即只有文件作用域。但通过一下关键字修饰可以改变全局变量的作用范围。

1、声明与定义的区别

函数或变量在声明时,并没有给它实际的物理内存空间,它有时候可保证你的程序编译通过;函数或变量在定义时,它就在内存中有了实际的物理空间。

如果你在编译单元中引用的外部变量没有在整个工程中任何一个地方定义的话,那么即使它在编译时可以通过,在连接时也会报错,因为程序在内存中找不到这个变量。函数或变量可以声明多次,但定义只能有一次。

2、全局变量的声明和定义

(1)使用extern关键字

extern的作用:

在C/C++中,为了使全局变量的作用域扩大到多个文件中,C++中提供了extern关键字。

全局变量只要在一个文件中定义后,在其他需要使用的源文件中只要使用extern关键字,即可在该文件中使用,概括下就是:extern扩展全局变量的作用域。

若在头文件中出现:extern int Num;,extern的作用就是声明函数或变量的作用范围,其声明的函数和变量可以在本编译单元或其他编译单元中使用。即B编译单元要引用A编译单元中定义的全局变量或函数时,可在B编译单元中加上extern声明,声明全局变量在外部已经定义了,在编译阶段,B编译单元虽然找不到该函数或变量,但它不会报错,它会在链接时从A编译单元生成的目标代码中找到此函数。

虽然全局变量定义后不使用extern关键字的话只能在本文件中使用,但是如果你在其他文件中定义同样名字的全局变量的话,那是不可以的(在链接的时候会出错)。

(2)使用static关键字

static和extern不可同时修饰一个变量因为外部变量是需要被其他编译单元访问的,而静态变量只能在被定义的文件中使用,即static修饰的全局变量的作用域只能是本身的编译单元。

static关键字实现了在不同的文件中使用相同名字的全局变量,在C/C++中静态局部变量的特点与应用中我们已经说过static关键字了,用static修饰的局部变量只能在定义变量的函数中使用,那么用static修饰的全局变量也就只能在定义其的文件中使用了,这就是传说中的静态全局变量。

static修饰的全局变量的声明与定义同时进行,即当你在头文件中使用static声明了全局变量,同时它也被定义了。

在其他编译单元使用它时,只是简单的把其值复制给了其他编译单元,其他编译单元会另外开个内存保存它,在其他编译单元对它的修改并不影响本身在定义时的值。即在其他编译单元A使用它时,它所在的物理地址,和其他编译单元B使用它时,它所在的物理地址不一样,A和B对它所做的修改都不能传递给对方。

多个地方引用静态全局变量所在的头文件,不会出现重定义错误,因为在每个编译单元都对它开辟了额外的空间进行存储。

3、全局变量的存储

如下图所示:



BSS的全称是Block Started by Symbol,在采用段式内存管理的架构中,BSS段通常是一块用于存放程序中未初始化的全局变量和静态变量的一块内存区域。C/C++文件中定义的全局变量就存储在这个位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: