所谓的作用域就是指变量起作用的范围,也是变量的有效范围。变量按他的作用域可以分为局部变量和全局变量。
在一个函数内部声明的变量是内部变量,它只在本函数内有效,在本函数以外是不能使用的,这样的变量就是局部变量。此外,函数的形参也是局部变量,形参我们会在后面再详细解释。
比如上节课程序中定义的 unsigned long sec 这个变量,它是定义在 main 函数内部的,所以只能由 main 函数使用,中断函数就不能使用这个变量。同理,我们如果在中断函数内部定义的变量,在 main 函数中也是不能使用的。
在函数外声明的变量就是全局变量。一个源程序文件可以包含一个或者多个函数,全局变量的作用范围是从它开始声明的位置一直到程序结束。
比如上节课程序中定义的 unsigned char LedBuff[6]这个数组,它的作用域就是从开始定义的位置一直到程序结束,不管是 main 函数,还是中断函数 InterruptTimer0,都可以直接使用这个数组。
局部变量只有在声明它的函数范围内可以使用,而全局变量可以被作用域内的所有的函数直接使用。所以在一个函数内既可以使用本函数内声明的局部变量,也可以使用全局变量。
从编程规范上讲,一个程序文件内所有的全局变量都应定义在文件的开头部分,在文件中所有函数之前。
由于 C 语言函数只有一个返回值,但是我们却经常会希望一个函数可以提供或影响多个结果值,这时我们就可以利用全局变量来实现。但是考虑到全局变量的一些特征,应该限制全局变量的使用,过多使用全局变量也会带来一些问题。
1) 全局变量可以被作用域内所有的函数直接引用,可以增加函数间数据联系的途径,但同时加强了函数模块之间的数据联系,使这些函数的独立性降低,对其中任何一个函数的修改都可能会影响到其它函数的执行结果,函数之间过于紧密的联系不利于程序的维护的。
2) 全局变量的应用会降低函数的通用性,函数在执行的时候过多依赖于全局变量,不利于函数的重复利用。目前我们编写的程序还都比较简单,就一个.c 文件,但以后我们要学到一个程序中有多个.c 文件,当一个函数被另外一个.c 文件调用的时候,必须将这个全局变量的变量值一起移植,而全局变量不只被一个函数调用,这样会引起一些不可预见的后果。
3) 过多使用全局变量会降低程序的清晰度,使程序的可读性下降。在各个函数执行的时候都可能改变全局变量值,往往难以清楚的判断出每个时刻各个全局变量的值。
4) 定义全局变量会永久占用单片机的内存单元,而局部变量只有进入定义局部变量的函数时才会占用内存单元,函数退出后会自动释放所占用的内存。所以大量的全局变量会额外增加内存消耗。
综上所述之原因,在编程规范上有一条原则,就是尽量减少全局变量的使用,能用局部变量代替的就不用全局变量。
还有一种特殊情况,大家在看别人程序的时候请注意,C 语言是允许局部变量和全局变量同名的,他们定义后在内存中占有不同的内存单元。如果在同一源文件中,全局变量和局部变量同名,在局部变量作用域范围内,只有局部变量有效,全局变量不起作用,也就是说局部变量具有更高优先级。但是从编程规范上讲,是要避免全局变量与局部变量重名的,从而避免不必要的误解和误操作。