对于新手来说,有一点非常讽刺,那就是当我们这些新手认为某些特性很有用而大量使用时,往往那些经验丰富的程序员都会非常谨慎的对待。像是全局变量,很多新手都非常喜欢(我倒是谈不上喜欢或讨厌),因为它的作用域是整个源文件,整个程序的各个部分都可以使用,于是我们就不需要将它们作为参数传递给函数。但是,就是因为程序中的各个部分都可以随意使用它,才使得全局变量存在很大的风险:假设这种情况,当我们的程序因为一个变量的错误赋值而出现问题时,如果是某个函数的局部变量,我们只需要在该函数的可见域里面找问题,但是如果是全局变量呢?那么问题就可能出现在整个程序中任何地方了。所以,最好的做法就是避免使用全局变量,如果我们的程序中有一个以上的全局变量,我们就需要认真斟酌,其中是否有些根本就不需要声明为全局变量呢。
这里又有一个新的疑问,好吧,我可以不使用全局变量,但是这样全局变量还有意义吗!!当然有,而且意义很大。全局变量最根本作用就是作为模块函数调用间的内部状态。什么是内部状态呢?举个例子,如果现在我正在写一个图形库,里面每条线都是从上一条线的结束处开始,那么我们就必须记录这个结束处作为内部状态的一部分。可以这样认为,内部状态就是各个函数调用间的通信,当这个状态因为某个函数而改变时,会使另一个函数调用开始发挥作用。局部变量根本不能作为内部状态,因为它的作用域只是它所声明的函数,函数一旦结束,它所存储的值也就丢失。但是,这时使用全局变量依然并不代表我们的程序是安全的,全局变量的危险依然存在。所以,这时我们就要使用static来修饰全局变量,使它的链接性变为内部。这种情况对于多模块的程序来说尤其重要,因为全局变量对于这个文件都是可见的,所以如果没有static,那么任何模块都可以使用,而且不能声明一个重名的变量,但是我们知道,实际开发中,是不同人进行不同模块的开发的,彼此间对于变量名的使用是不知道的,所以名称冲突是随时会发生的,尤其是对于同一个问题的开发。使用static,就可以避免这种冲突,因为static全局变量只对于所声明的模块是可见的,只可以在所声明的模块中使用,其他模块无法使用,所以其他模块是可以声明一个重名的变量的。虽然static在很多程序语言中的意义是说明对象是如何存储的,但是它的使用意义却更接近于private。
所以,如果我们使用一个全局变量,请在前面加上static,这样就可以避免一些我们不知道的错误。