您的位置:首页 > 其它

操作系统和编译器如何识别全局变量和局部变量

2015-11-26 11:35 323 查看
操作系统,只管调度进程,线程编译器 根据编程语言的定义,确定变量的作用于,存储类型,生命周期!
定义在函数外部的变量,只有文件静态变量,和外部变量
外部变量,是实实在在的全局变量,不论作用域还是生命周期。

静态变量是局部作用域的,生命周期为,程序的生命周期的变量。
自动变量和函数参数,是局部作用域的生命周期为函数结束的局部变量。

寄存器变量,用register定义, 是局部变量;
函数内部的 静态变量 ,语句组内部的静态变量,局部作用域的,生命周期为,程序的生命周期的变量。

静态变量,编译器 ,可以通过 static 关键字知道。

自动变量,1)函数内部定义的非静态变量,非寄存器变量是自动变量。
2)函数参数,只能是自动变量,不过也可能定义在寄存器中。
这和调用约定有关,因此不可以用register定义。

C语言没有全局变量这种数据类型。
只有4种存储类型,和变量的作用域与生命周期的概念。
C++ 同样没有全局变量这种数据类型。
有另外的两种作用域
1) namespace 作用域。
2) 类(类型)作用域。
C只有 全局,文件,函数以及函数内部的语句组,4种逐渐缩小的作用域。
其中内层,对外部作用域,具有完全的遮蔽作用。
C++ 可以通过作用域限定符,区分不同作用域(类,名空间)的名字。
类作用域,可以通过访问权限,限制外部的访问权。

函数作用域(语句组作用域)是封闭的作用域,外部不可以使用函数内部定义的名字。
也不会和外部有命名冲突,只会遮蔽外部的名字。

类作用于,和名空间由于访问方式不同,命名冲突和遮蔽有些特殊。

函数和全局域,基本不会和类作用域有命名冲突,除非类方法内部。

命名空间,可以避免命名冲突。

类继承体系中,则有遮蔽现象。
还有访问权限问题。

实际上,全局变量,有两个概念可以判定
1)作用域(空间)   ===>由定义和声明位置,和定义和声明使用的关键字决定。
2)生命周期(时间) ===>外部和静态变量,的生命周期是全局的,从初始化到程序结束。
函数参数,和函数局部非静态变量,是局部变量
函数参数的传递,是跨函数的(实参,变成形参);

函数内部定义的,局部变量,只有定义处可见,作用域是函数甚至语句组局部,
其中静态变量,生命周期是全局的,非静态是函数甚至语句组的。

全局变量,不是C,C++的概念。

而是,使用编程语言的程序员的概念。

所以,全局变量 和C,C++的存储类型,作用域,生命周期等,不是一一对应的概念。
所以,可以有不同的理解。

所以这个概念是很模糊的,不清晰的。

比如局部静态变量,类的静态变量,是否全局变量,就不是可以清晰的说明的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: