Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318796
  • 博文数量: 30
  • 博客积分: 3020
  • 博客等级: 中校
  • 技术积分: 1391
  • 用 户 组: 普通用户
  • 注册时间: 2006-07-03 13:21
文章存档

2011年(2)

2010年(4)

2009年(23)

2008年(1)

我的朋友

分类: LINUX

2009-07-23 11:17:55

术语static有着不寻常的历史.起初,在C中引入关键字static是为了表示退出一个块后仍然存在的局部变量。随后,static在C中有了第二种含义:用来表示不能被其它文件访问的全局变量和函数。为了避免引入新的关键字,所以仍使用static关键字来表示这第二种含义。最后,C++重用了这个关键字,并赋予它与前面不同的第三种含义:表示属于一个类而不是属于此类的任何特定对象的变量和函数(与Java中此关键字的含义相同)。
         变量可以分为:全局变量、静态全局变量、静态局部变量和局部变量。
         按存储区域分:全局变量、静态全局变量和静态局部变量都存放在内存的静态存储区域,局部变量存放在内存的栈区。
         按作用域分:全局变量在整个工程文件内都有效;静态全局变量只在定义它的文件内有效;静态局部变量只在定义它的函数内有效,只是程序仅分配一次内存,函数返回后,该变量不会消失;局部变量在定义它的函数内有效,但是函数返回后失效。
         全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。
        
         从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
        
         static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件.
  static全局变量与普通的全局变量有什么区别?static全局变量只初使化一次,防止在其他文件单元中被引用;
  static局部变量和普通局部变量有什么区别?static局部变量只被初始化一次,下一次依据上一次结果值;
         static函数与普通函数有什么区别?static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝
         全局变量和静态变量如果没有手工初始化,则由编译器初始化为0。



(a)若程序由一个源文件构成时,全局变量与全局静态变量没有区别。
(b)若程序由多个源文件构成时,全局变量与全局静态变量不同:全局静态变量使得该变量成为定义该变量的源文件所独享,即:全局静态变量对组成该程序的其它源文件是无效的。
静态全局变量的作用:
(a)不必担心其它源文件使用相同变量名,彼此相互独立。
(b)在某源文件中定义的静态全局变量不能被其他源文件使用或修改。
例如:一个程序由两个源文件组成,其中在一个源文件中定义了“int n;”,在另一个源文件中定义了“static int n;”则程序给它们分别分配了不同的空间,两个值互不干扰。
例如:下面在file1.cpp中声明全局变量n,在file2.cpp中定义全局静态变量n。文件file1.cpp和file2.cpp单独编译都能通过,但连接时,file1.cpp中的变量n找不到定义,产生连接错误。
// file1.cpp
# include
void fn()
extern int n;
void main()
{
n=20;
cout<fn();
}
// file2.cpp
# include
static int n; // 默认初始化为0,注意此处定义的n 只能在file2.cpp中使用。
void fn()
{
n++;
cout<}
静态函数:使某个函数只在一个源文件中有效,不能被其他源文件所用。
定义:在函数前面加上static。
说明:函数的声明和定义默认情况下在整个程序中是extern的。
静态函数的效果:
(1)它允其他源文件建立并使用同名的函数,而不相互冲突。
(2) 声明为静态的函数不能被其他源文件所调用,因为它的名字不能得到。  
    
拙见:
静态变量和函数一般都局限于一个编译单元也就是.cpp文件中。
我想这是最主要的区别。
 
阅读(333) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~