操作系统和编译器是如何识别全局变量和局部变量的
操作系统和编译器是怎么识别全局变量和局部变量的
如题,希望能解答的详细一点,谢谢
------解决方案--------------------
操作系统,只管调度进程,线程
编译器 根据编程语言的定义,确定变量的作用于,存储类型,生命周期!
举例
C
定义在函数外部的变量,只有文件静态变量,和外部变量
外部变量,是实实在在的全局变量,不论作用域还是生命周期。
静态变量是局部作用域的,生命周期为,程序的生命周期的变量。
自动变量和函数参数,是局部作用域的生命周期为函数结束的局部变量。
寄存器变量,用register定义, 是局部变量;
函数内部的 静态变量 ,语句组内部的静态变量,局部作用域的,生命周期为,程序的生命周期的变量。
静态变量,编译器 ,可以通过 static 关键字知道。
自动变量,1)函数内部定义的非静态变量,非寄存器变量是自动变量。
2)函数参数,只能是自动变量,不过也可能定义在寄存器中。
这和调用约定有关,因此不可以用register定义。
C语言没有全局变量这种数据类型。
只有4种存储类型,和变量的作用域与生命周期的概念。
C++ 同样没有全局变量这种数据类型。
有另外的两种作用域
1) namespace 作用域。
2) 类(类型)作用域。
C只有 全局,文件,函数以及函数内部的语句组,4种逐渐缩小的作用域。
其中内层,对外部作用域,具有完全的遮蔽作用。
C++ 可以通过作用域限定符,区分不同作用域(类,名空间)的名字。
类作用域,可以通过访问权限,限制外部的访问权。
函数作用域(语句组作用域)是封闭的作用域,外部不可以使用函数内部定义的名字。
也不会和外部有命名冲突,只会遮蔽外部的名字。
类作用于,和名空间由于访问方式不同,命名冲突和遮蔽有些特殊。
函数和全局域,基本不会和类作用域有命名冲突,除非类方法内部。
名空间,可以避免命名冲突。
类继承体系中,则有遮蔽现象。
还有访问权限问题。
实际上,全局变量,有两个概念可以判定
1)作用域(空间) ===>由定义和声明位置,和定义和声明使用的关键字决定。
2)生命周期(时间) ===>外部和静态变量,的生命周期是全局的,从初始化到程序结束。
函数参数,和函数局部非静态变量,是局部变量
函数参数的传递,是跨函数的(实参,变成形参);
函数内部定义的,局部变量,只有定义处可见,作用域是函数甚至语句组局部,
其中静态变量,生命周期是全局的,非静态是函数甚至语句组的。
全局变量,不是C,C++的概念。
而是,使用编程语言的程序员的概念。
所以,全局变量 和C,C++的存储类型,作用域,生命周期等,不是一一对应的概念。
所以,可以有不同的理解。
所以这个概念是很模糊的,不清晰的。
比如局部静态变量,类的静态变量,是否全局变量,就不是可以清晰的说明的。
要依照各自理解来判定。
个人倾向于,都算作全局的。
------解决方案--------------------
C++一样没有全局变量,虽然有全局名空间。
但是依然是外部变量,和静态变量,寄存器变量,自动变量;来区分作用域。
不过增加了名空间,和类空间两种作用域而已。
其中类作用域只是类外作用域的划分,不是独立的作用域。
匿名名空间,可以直接定义文件作用域,可以不用static 了如此而已。
全局名空间,就是C的全局作用域,即外部变量的作用域。
static 定义局部空间,全局生命周期的数据。
类作用域变量,一种是类非静态成员,一种是静态成员。如此而已。
其中非静态成员是对象的一部分,是不用考虑是否全局变量的。
因为类的对象,可以定义在任何类定义可见的地方。
定义成全局的,就是全局变量。
如题,希望能解答的详细一点,谢谢
操作系统
全局变量
局部变量
编译器
------解决方案--------------------
操作系统,只管调度进程,线程
编译器 根据编程语言的定义,确定变量的作用于,存储类型,生命周期!
举例
C
定义在函数外部的变量,只有文件静态变量,和外部变量
外部变量,是实实在在的全局变量,不论作用域还是生命周期。
静态变量是局部作用域的,生命周期为,程序的生命周期的变量。
自动变量和函数参数,是局部作用域的生命周期为函数结束的局部变量。
寄存器变量,用register定义, 是局部变量;
函数内部的 静态变量 ,语句组内部的静态变量,局部作用域的,生命周期为,程序的生命周期的变量。
静态变量,编译器 ,可以通过 static 关键字知道。
自动变量,1)函数内部定义的非静态变量,非寄存器变量是自动变量。
2)函数参数,只能是自动变量,不过也可能定义在寄存器中。
这和调用约定有关,因此不可以用register定义。
C语言没有全局变量这种数据类型。
只有4种存储类型,和变量的作用域与生命周期的概念。
C++ 同样没有全局变量这种数据类型。
有另外的两种作用域
1) namespace 作用域。
2) 类(类型)作用域。
C只有 全局,文件,函数以及函数内部的语句组,4种逐渐缩小的作用域。
其中内层,对外部作用域,具有完全的遮蔽作用。
C++ 可以通过作用域限定符,区分不同作用域(类,名空间)的名字。
类作用域,可以通过访问权限,限制外部的访问权。
函数作用域(语句组作用域)是封闭的作用域,外部不可以使用函数内部定义的名字。
也不会和外部有命名冲突,只会遮蔽外部的名字。
类作用于,和名空间由于访问方式不同,命名冲突和遮蔽有些特殊。
函数和全局域,基本不会和类作用域有命名冲突,除非类方法内部。
名空间,可以避免命名冲突。
类继承体系中,则有遮蔽现象。
还有访问权限问题。
实际上,全局变量,有两个概念可以判定
1)作用域(空间) ===>由定义和声明位置,和定义和声明使用的关键字决定。
2)生命周期(时间) ===>外部和静态变量,的生命周期是全局的,从初始化到程序结束。
函数参数,和函数局部非静态变量,是局部变量
函数参数的传递,是跨函数的(实参,变成形参);
函数内部定义的,局部变量,只有定义处可见,作用域是函数甚至语句组局部,
其中静态变量,生命周期是全局的,非静态是函数甚至语句组的。
全局变量,不是C,C++的概念。
而是,使用编程语言的程序员的概念。
所以,全局变量 和C,C++的存储类型,作用域,生命周期等,不是一一对应的概念。
所以,可以有不同的理解。
所以这个概念是很模糊的,不清晰的。
比如局部静态变量,类的静态变量,是否全局变量,就不是可以清晰的说明的。
要依照各自理解来判定。
个人倾向于,都算作全局的。
------解决方案--------------------
C++一样没有全局变量,虽然有全局名空间。
但是依然是外部变量,和静态变量,寄存器变量,自动变量;来区分作用域。
不过增加了名空间,和类空间两种作用域而已。
其中类作用域只是类外作用域的划分,不是独立的作用域。
匿名名空间,可以直接定义文件作用域,可以不用static 了如此而已。
全局名空间,就是C的全局作用域,即外部变量的作用域。
static 定义局部空间,全局生命周期的数据。
类作用域变量,一种是类非静态成员,一种是静态成员。如此而已。
其中非静态成员是对象的一部分,是不用考虑是否全局变量的。
因为类的对象,可以定义在任何类定义可见的地方。
定义成全局的,就是全局变量。