操作系统和编译器是怎么识别全局变量和局部

如题所述

    操作系统,只管调度进程,线程编译器 根据编程语言的定义,确定变量的作用于,存储类型,生命周期!  

    定义在函数外部的变量,只有文件静态变量,和外部变量  

    外部变量,是实实在在的全局变量,不论作用域还是生命周期。  

    静态变量是局部作用域的,生命周期为,程序的生命周期的变量。  

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

    寄存器变量,用register定义, 是局部变量;  

    函数内部的 静态变量 ,语句组内部的静态变量,局部作用域的,生命周期为,程序的生命周期的变量。  

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

    自动变量,1)函数内部定义的非静态变量,非寄存器变量是自动变量。  

    2)函数参数,只能是自动变量,不过也可能定义在寄存器中。  

    这和调用约定有关,因此不可以用register定义。  

    C语言没有全局变量这种数据类型。  

    只有4种存储类型,和变量的作用域与生命周期的概念。  

    C++ 同样没有全局变量这种数据类型。  

    有另外的两种作用域  

    1) namespace 作用域。  

    2) 类(类型)作用域。  

    C只有 全局,文件,函数以及函数内部的语句组,4种逐渐缩小的作用域。  

    其中内层,对外部作用域,具有完全的遮蔽作用。  

    C++ 可以通过作用域限定符,区分不同作用域(类,名空间)的名字。  

    类作用域,可以通过访问权限,限制外部的访问权。  

    函数作用域(语句组作用域)是封闭的作用域,外部不可以使用函数内部定义的名字。  

    也不会和外部有命名冲突,只会遮蔽外部的名字。  

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

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

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

    类继承体系中,则有遮蔽现象。  

    还有访问权限问题。  

    实际上,全局变量,有两个概念可以判定  

    1)作用域(空间)   ===>由定义和声明位置,和定义和声明使用的关键字决定。  

    2)生命周期(时间) ===>外部和静态变量,的生命周期是全局的,从初始化到程序结束。  

    函数参数,和函数局部非静态变量,是局部变量  

    函数参数的传递,是跨函数的(实参,变成形参);  

    函数内部定义的,局部变量,只有定义处可见,作用域是函数甚至语句组局部,  

    其中静态变量,生命周期是全局的,非静态是函数甚至语句组的。  

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

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

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

    所以,可以有不同的理解。  

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

    比如局部静态变量,类的静态变量,是否全局变量,就不是可以清晰的说明的。 

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-03-30
全局变量和局部变量的区别是在存储器中位置不同,具体说,全局变量存储在数据段中,局部变量都有可能,一般来说在堆栈段
相似回答