VC+++ 全局变量的定义
1个回答
展开全部
【原创】
下面是对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,而函数不需要。
下面是对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,而函数不需要。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询