静态变量和全局变量的区别
变量⼀般有两个属性,⼀个是作⽤域,⼀个是内存分布空间,静态变量的内存是分配在全局区(静态区)的,
全局变量与全局静态变量的区别:
(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");}
static修饰的变量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;
那么到底能不能在头⽂件中定义全局变量呢?答案是可以的
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论