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

来源:互联网 发布:实况足球2018球员数据 编辑:程序博客网 时间:2024/06/06 04:09
 操作系统,只管调度进程,线程编译器 根据编程语言的定义,确定变量的作用于,存储类型,生命周期! 定义在函数外部的变量,只有文件静态变量,和外部变量 外部变量,是实实在在的全局变量,不论作用域还是生命周期。  静态变量是局部作用域的,生命周期为,程序的生命周期的变量。 自动变量和函数参数,是局部作用域的生命周期为函数结束的局部变量。  寄存器变量,用register定义, 是局部变量; 函数内部的 静态变量 ,语句组内部的静态变量,局部作用域的,生命周期为,程序的生命周期的变量。  静态变量,编译器 ,可以通过 static 关键字知道。  自动变量,1)函数内部定义的非静态变量,非寄存器变量是自动变量。          2)函数参数,只能是自动变量,不过也可能定义在寄存器中。              这和调用约定有关,因此不可以用register定义。  C语言没有全局变量这种数据类型。 只有4种存储类型,和变量的作用域与生命周期的概念。 C++ 同样没有全局变量这种数据类型。 有另外的两种作用域 1) namespace 作用域。 2) 类(类型)作用域。 C只有 全局,文件,函数以及函数内部的语句组,4种逐渐缩小的作用域。 其中内层,对外部作用域,具有完全的遮蔽作用。 C++ 可以通过作用域限定符,区分不同作用域(类,名空间)的名字。 类作用域,可以通过访问权限,限制外部的访问权。  函数作用域(语句组作用域)是封闭的作用域,外部不可以使用函数内部定义的名字。 也不会和外部有命名冲突,只会遮蔽外部的名字。  类作用于,和名空间由于访问方式不同,命名冲突和遮蔽有些特殊。  函数和全局域,基本不会和类作用域有命名冲突,除非类方法内部。  命名空间,可以避免命名冲突。  类继承体系中,则有遮蔽现象。 还有访问权限问题。  实际上,全局变量,有两个概念可以判定 1)作用域(空间)   ===>由定义和声明位置,和定义和声明使用的关键字决定。 2)生命周期(时间) ===>外部和静态变量,的生命周期是全局的,从初始化到程序结束。 函数参数,和函数局部非静态变量,是局部变量 函数参数的传递,是跨函数的(实参,变成形参);  函数内部定义的,局部变量,只有定义处可见,作用域是函数甚至语句组局部, 其中静态变量,生命周期是全局的,非静态是函数甚至语句组的。 全局变量,不是C,C++的概念。 而是,使用编程语言的程序员的概念。 所以,全局变量 和C,C++的存储类型,作用域,生命周期等,不是一一对应的概念。所以,可以有不同的理解。 所以这个概念是很模糊的,不清晰的。 比如局部静态变量,类的静态变量,是否全局变量,就不是可以清晰的说明的。     


 

0 0