sherrylso

C++博客 首页 新随笔 联系 聚合 管理
  18 Posts :: 0 Stories :: 124 Comments :: 0 Trackbacks
static关键字,有两个作用:
1) 作用于局部变量,定义该变量的存储方式,就是我们常常说的静态局部变量。
2) 作用于用于模块内声明的变量和函数,用于指示其可见性。

先谈谈变量和函数的可见性。在默认的情况下,模块内声明的变量和函数是全局可见的,如下:
//Test1.cpp
struct {  
    
int m;
} test;
//Test2.cpp
struct {  
    
int m;
} test;
BUILD的结果会报"multiply defined symbols found"
如果想避免这样的错误,需要使用static关键字。

不过好像如果你使用typedef,就不会出现这样的错误。
//Test1.cpp
typedef struct {  
    
int m;
} test;
//Test2.cpp
typedef struct {  
    
int m;
} test;
或者:
//Test1.cpp
typedef struct {  
    
int m;
} test;
//Test2.cpp
typedef int test;
关于这一点,我想可能是typedef的作用域是限定在模块内的,所以没有这个问题。这个使用VC和使用GCC都没问题,不过我没有查到官方的文档。

最后一点,想说的是,关于static变量的生命周期。一般来说:static声明的变量初始化,只是在程序运行的第一次被执行。不过有例外,那就是如果该变量定义在dll内,那么该变量的初始化工作是在dll被装载时执行,在这种情况下,程序虽然只运行一次,但是该静态变量可能会被初始化好几次(与dll被装载的次数有关). 这个问题本质上是:static声明的变量的生命周期与包含它的组件相关。从这个意义上,我们可以说,static变量在不同的包含组件(EXE或DLL)上表现出不同行为,移植能力差,容易造成BUG,这样的BUG也不容易发现。我们在开发程序的时候,不可能去假设该静态变量是被包含在什么样的组件里。我想,这也是一个不鼓励使用static变量的一个重要原因。







posted on 2009-03-12 18:12 爱上龙卷风 阅读(2108) 评论(2)  编辑 收藏 引用

Feedback

# re: 关于static关键字 2009-03-13 09:14 LOGOS
struct{ int a} test;test是一个变量
typedef struct{int a} test; test是一个类型
你把他们当成一回事了吗⊙﹏⊙b
  回复  更多评论
  

# re: 关于static关键字 2009-03-16 00:14 wocow3
O(∩_∩)O,出事儿了  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理