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

全局变量具有外部连接性,即同一工程中其它文件中的也可引用。
而静态变量不具有外部连接性,即同一工程中其它文件中不可以引用。

例1:
//cpp1.cpp
extern int x=10;
static int y=5;

//cpp2.cpp
#include <iostream.h>
void main() {
    extern int x;
    extern int y;
    cout<<x<<endl;
    cout<<y<<endl;
}

将这两个文件放在同一工程中,你发现每一文件单独编译能通过,但作为工程不能构成.exe文件运行。若将有关变量y的行注释后(或将static换成extern)就可以了。这是因为静态变量的作用域在本文件内,不能扩充到其它文件。其作用是当多人合作开发一个工程时,仅在自己的文件内使用的全局变量用静态变量不会与其他人用的变量相混淆,这就是标识符的一致性。


例2:

static __inline__ bool Is_Queue_Empty(void);//geekos keyboard.c

说明函数的作用域仅仅是定义它们的文件。与之相反的关键字是'extern'


变量可以分为全局变量、静态全局变量、静态局部变量和局部变量
按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的全局数据区,局部变量存放在内存的栈区
按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。局部变量的值不可知。
代码如下:
//test.cpp
#include <iostream.h>
extern int a;//变量声明,不是定义
static int b=5;
void func1(){
  cout<<b<<endl<<a<<endl;//结果为5
}

//main.cpp
int a;
int b=10;
void func2(){
  static int i;
  i++;
  cout<<i<<endl;
}

void func1();

void main(){
  a=20;
  func1();
  func2();
  func2();
}
输出结果为
5
20
1
2


全局静态函数的应用比较常见的就是

static int fun(){

          ...;

          return 1;

}

当我们希望在多个类中调用fun函数时,我们必须把fun声明为static类型,不然在link时编译器会发现多个关于fun的定义。这种函数的应用,多少带有C的色彩,尤其当我们在C环境写好的函数,移植到C++中时,需要在函数前面需要加上static,而如果我们需要移植多个函数时,更通用的一种方法是使用未命名名字空间

namespace{

          int fun() {

               ...;

              return 1;

          }

          …

}


from:http://blog.csdn.net/pipisorry/article/details/29432147

ref:关于静态函数的一些思考http://blog.csdn.net/ugg/article/details/1428872

http://bbs.csdn.net/topics/10104758

http://www.cppblog.com/Lee/archive/2009/03/19/77103.html

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值