静态变量和全局变量的区别

变量一般有两个属性,一个是作用域,一个是内存分布空间,静态变量的内存是分配在全局区(静态区)的,

全局变量与全局静态变量的区别:

(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 
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值