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变量的一个重要原因。