VC+++ 全局变量的定义

 我来答
kwbplcz
2014-09-29 · 超过22用户采纳过TA的回答
知道答主
回答量:42
采纳率:0%
帮助的人:42.8万
展开全部
【原创】

下面是对C++作用域的几个总结:

按照作用域来分,有两种变量:

全局变量和局部变量,全局变量是在所有函数体外部声明的,局部变量则是局限于一个函数,
局部变量也叫自动变量,即auto修饰符,但这个修饰符是自动的,所以不用写;

局部变量还可以有一个修饰符register,叫寄存器变量,注意,这个修饰符只是针对局部变量,
register可以用在局部变量和函数的形参上;

编译器有一个连接的过程,连接代表变量和函数体的存储空间,连接分为内部连接和外部连接,
内部连接的意思是只为正在编译的文件创建存储空间,
外部连接的意思是为所有编译过的文件创建一片单独的存储空间,

注意,连接只针对全局变量而言,连接器不知道局部变量,所以对局部变量来说没有连接,

针对全局变量,有两种连接,外部连接和内部连接,全局变量和函数默认为外部连接,即在所有文件中都是可见的,要在另一个文件中使用一个文件中定义的变量,就通过extern来说明,
当在全局变量声明时说明static,则只在当前文件可见,此时就是内部连接,

Static这个修饰符的作用:

修饰全局和局部变量的不同:

第一方面,
全局变量和函数默认是整个程序里都是可见的,
当加上static后,说明只在当前文件里是可见的,

第二方面,
局部变量默认是在函数内可见的,
当加上static后,也仍然只在函数内可见,但是生存期是在整个程序内,
在第一次调用函数时初始化,以后就不初始化了,

从所存储的位置上方面来说明Static修饰符的作用:

首先,程序运行的时候内存有几种使用方式:
第一,静态存储区,即静态数据区,
第二,堆栈,这是在函数进入的时候的局部变量的分配区,
第三,动态存储区,即程序里通过malloc或者new分配出来的,
其中,第一和第二两个区域的数据的分配和销毁是由编译器管理的,
第三个区域则是由程序编写者控制的,由程序员决定何时分配及何时销毁,

所以,从存储位置的角度来讲,
首先,全局变量是存储在静态数据区的,局部变量是在栈上分配的,
其次,当加上static修饰符后,
对全局变量的影响是修改了可见性,仍然是存储在静态数据区,
对局部变量的影响是修改了生存期,此时局部变量就存储在静态数据区,只是说可见性仍然是函数内部,

所以,从存储区即生存期和可见性即作用域两方面来讲,
可以用一句话概括Static对全局和局部变量的影响:
全局变量是存储在静态数据区的,可见性为整个程序,加上static后,可见性为当前的文件,存储区不变,
局部变量是存储在堆栈数据区的,可见性为当前函数,加上static后,存储区为静态数据区,可见性不变,

即,一个变量有两个特征:存储位置和可见性,

对extern的另外说明:

首先,要在一个文件里使用在另一文件中定义的变量时通过extern来引用,
但注意可以在函数内部来extern,也可以在函数之外,即声明全局变量的地方
来extern,二者的不同只是说在函数内extern的话只在函数内可见,如果在函数
外部extern的话则对整个文件都是可见的,

其次,注意该修饰符只是针对全局变量,
当在一个文件里定义了一个变量或函数,而要在另一个文件里使用时,
对于变量来说用extern来引用,
但对于函数来说就不用,而是有一个方法的声明就可以了,
这就是为什么一个lib加一个头文件这种方式很普遍的原因,
而为什么变量前要加extern来引用,而函数不用,
本质原因是一个变量例如int i,这样一个语句就是该变量的定义和声明,
但voif f();这只是函数的声明,要加上大括号,才是函数的定义,
也正式因为变量和函数在定义和声明时的不同,才导致要在另一个文件里使用某个变量时需要加extern,而函数不需要。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式