关于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_vala_fun()

static int a_val = 10;
static void a_func(){ cout << a_val << endl; }

  即使在a.cpp以外的文件对a_vala_func()追加外部声明。也无法使用变量a_val 或调用函数a_func()

  连接时编译器会提示连接不到a_vala_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将一个局部变量升级成一个具有局部作用域的"全局变量"。听着似乎有点拗口。

 

 

posted @ 2012-12-22 17:17  小北。  阅读(196)  评论(0)    收藏  举报