变量一般有两个属性,一个是作用域,一个是内存分布空间,静态变量的内存是分配在全局区(静态区)的,
全局变量与全局静态变量的区别:
(1)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(2)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享, 即:全局静态变量对组成该程序的其它源文件是无效的。
静态全局变量的作用:
(1)不必担心其它源文件使用相同变量名,彼此相互独立。
(2)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
如file1.cpp static int a; int add(){ a++ ; return a;};
file2.cpp static int b; int del(){ b-- ; return b;};
file3.cpp void main(){ int dd,kk,jj; dd=add(); kk=del(); printf("%d,%d\n",dd,kk); system("pause");}
file2.cpp和file3.cpp是不能使用a的。
接下来再来看看全局变量,如果是多个源文件中,如何在file2.cpp中引用file1.cpp中的全局变量呢?
这就要用到extern了,在file2.cpp中声明extern字段,表示引用另外一个模块的全局变量,但这是要注意一个问题,就是不要在头文件中定义全局变量,这样会造成编译链接错误。
比如:a.h中 int a; int add();
a.cpp中 include"a.h" int add(){ a++ ; return a;};
b.h中 int b; int del();
b.cpp中 include"b.h" int del(){ b--; return b;};
c.cpp中 include"a.h" include"b.h" void main(){int aa,bb,cc; aa=del();bb=add();cc=a+2;}
编译会提示重复定义,因为每个cpp文件都是一个模块,c.cpp模块中包含了头文件a.h,相当于又重新为a分配了内存,这样跟a.cpp文件中的a相当于两个不同的内存地址,正确的做法是在a.cpp中定义int a,然后在c.cpp文件中使用extern int a;
那么到底能不能在头文件中定义全局变量呢?答案是可以的
可以用在头文件中static定义全局变量,static限定了变量只能在当前文件中使用,但是这种方法有个缺点,就是多占用了内存,比如头文件中定义了static int a,1.cpp和2.cpp分别包含了头文件,实际编译时分别定义了两个不同地址的变量a。
---------------------
作者:yurongjie135
来源:CSDN
原文:https://blog.csdn.net/yurongjie135/article/details/51378908
版权声明:本文为博主原创文章,转载请附上博文链接!