没有时间把一件事情做好,却有时间把一件事情反复做!
全部博文(191)
分类: C/C++
2014-03-18 15:14:59
原文地址:C中的符号重载——C语言系列(2) 作者:hoole
C语言的的一个优点就是简洁,但是C语言的一个问题就是它太简洁了,仅增加、修改或删除一个字符就会使原先的程序变成另外一个仍然有效却全然不同的程序。在C语言中,许多符号是被重载的——在不同的上下文环境里有不同的意义。甚至有些关键字也被重载而具有好几种意义。下面就C语言中常见易混淆的两个关键字static和extern进行说明。
1、static
相信大家一见这个关键字脑中就会出现"静态"两个字,修饰变量就叫静态变量,修饰函数就叫静态函数。不过,static修饰变量和函数所表现出来的意义是不同的。在函数内部,表示该变量的值在各个调用间一直保持延续性;在函数外部,表示该变量只对本文件可见(准确的讲是从定义之处开始到文件结尾)。在函数这一级,表示该函数只对本文件可见。static的意义相差如此之大,叫我如何去爱它^-^。不过幸好,有前辈高手对static进行深入彻底的理解,总结出了三大特点:
隐藏
地球人都知道,在C语言中全局变量和函数默认是全局可见的,但是如果不想全局可见 呢?static关键字就是用来解决这个问题的,加上static关键字,全局变量和函数就只对本文件可见了。一句话,static修饰全局变量和函数实现隐藏功能。
持久
在函数中,局部变量随函数的结束而消失。加上static关键字,变成局部静态变量,该变量就不随函数的结束而消失了。当static用来修饰局部变量的时候,改变了局部变量的存储位置,从原来的栈中存放改为静态存储区。局部静态变量在函数结束后,并没有被销毁,而是仍然驻留在内存当中,直到程序结束,只不过我们不能再对它进行访问。这种变量可以做为一个计数器来使用,用来统计一个函数被调用的次数。
默认为0
static修饰变量,该变量默认初始化为0。这是由于变量存储在静态存储区,而在静态数据区,内存中所有的字节默认值都是0x00。这个特点在某些场合还是很有用的。比如初始化一个稀疏矩阵,我们需要把所有元素都置0,然后把不是0的几个元素赋值。如果定义成静态的,就省去了一开始置0的操作。
2、extern
这里extern也有两种意思:用于变量,表示它在其他地方定义;用于函数定义,表示全局可见。如果用于函数声明,也表示它在其他地方定义。这里有点迷糊了吧,同一个关键字作用于函数竟然有两种意思。其实,我们可以完全无视extern用于函数定义的情形,因为函数默认是全局可见的。用于函数声明的情况也不多见。这里推荐一篇博文,文中详细透彻的解析了extern前世今生,来龙去脉:http://blog.csdn.net/keensword/archive/2005/06/23/401114.aspx