关于static用法的小结
摘要:接触c很久了。却感觉还是个半吊子。对c语言语言特性,陷阱的诸多问题没有一个系统的认识。遂决定阅读c相关比较热门的几本书。学习并实践c的每个语言特性。在细节的基础上,体会,去系统的认识这门语言。本文总结了对static关键字的一些认识。
static关键字,用法归结为两类。
1 修饰函数或全局变量时(代码块之外定义的变量)。修改该函数或全局变量的连接属性。使该函数或全局变量仅在定义该文件中可见。
例如:a.cpp中定义了一个全局变量int a_val和一个函数int a_func()。
int a_val = 10;
void a_func(){cout << a_val << endl;}
想在其他文件中使用变量a_val 或调用函数a_func(),只需要使用的文件中追加一个外部声明。
extern int a_val; extern void a_func();
就可以在a.cpp以外的地方使用a_val或调用函数a_func()。
但是,如果用static关键字修饰a_val或a_fun()。
static int a_val = 10;
static void a_func(){ cout << a_val << endl; }
即使在a.cpp以外的文件对a_val或a_func()追加外部声明。也无法使用变量a_val 或调用函数a_func()。
连接时编译器会提示连接不到a_val或a_func()的错误。
总结为:static改变了全局变量和函数的作用域。将全局变量和函数的作用域限制在了定义该变量或函数的文件中。
2 static修饰代码块中的变量时,改变该变量的存储类型。代码块中的变量,一般存储在堆栈中。该变量的生命周期是从定义处开始,到定义该变量的代码块结束。如果某代码块被反复执行时。那么改代码块中的定义的变量会随着该代码块的执行,被反复的创建->初始化->销毁。代码块之外的变量(上文中的全局变量),存储在静态存储区,在整个程序执行前被创建,并且在整个程序执行的生命周期内一直有效。
(追加一点:存储在静态存储区的全局变量,编译器会自动初始化。而存储在堆栈中的局部变量,编译器不会自动初始化。)
static会改变局部变量的存储类型,将该局部变量从堆栈中,移到存放全局变量的静态存储区。并且在程序运行中,一直存在。
一个简单的例子:
int global_val = 10;
void func();
int main()
{
func();
cout << endl;
func();
return 0;
}
void func(){
int local_val1 = 10;
int local_val2 = 10;
static int local_val3 = 10;
cout << "local_val1 " << ++local_val1 << " " << &local_val1 << endl;
cout << "local_val2 " << ++local_val2 << " " << &local_val2 << endl;
cout << "global_val " << ++global_val << " " << &global_val << endl;
cout << "local_val3 " << ++local_val3 << " " << &local_val3 << endl;
}
上述代码定义了:全局变量 global_val 局部变量local_val1 local_val2 还有static修饰的局部变量local_val3。
运行结果如下:

static修饰的局部变量local_val3,存储在全局变量global_val相邻的内存中。并且随着fun()函数反复调用,不会被反复的创建->初始化->销毁。
总结为:static将一个局部变量升级成一个具有局部作用域的"全局变量"。听着似乎有点拗口。
浙公网安备 33010602011771号