2022-12-09 11:46来源:m.sf1369.com作者:宇宇
静态全局变量,又称全局静态变量,是在全局变量前加一个static,使该变量只在这个源文件中可用。
全局变量也称为外部变量,它是在函数外部定义的变量。它不属于哪一个函数,它属于一个源程序文件。其作用域是从定义该变量的位置开始至源文件结束。
全局变量是在所有函数体的外部定义的,程序的所在部分(甚至其它文件中的代码)都可以使用。全局变量不受作用域的影响(也就是说,全局变量的生命期一直到程序的结束)。如果在一个文件中使用extern关键字来声明另一个文件中存在的全局变量,那么这个文件可以使用这个数据。
在多文件组成的程序里,全局变量与全局静态变量是不同的。在某一层次声明的变量的作用域就终止于该变量所在层次的末尾。唯一的区别是全局静态变量使得该变量成为定义该变量的源文件所独享。如果在一个文件中使用extern关键字来声明另一个文件中存在的静态全局变量,这个文件也不能够使用这个数据。
作用域的例外:
根据ANSI C++的标准,在for语句头中声明的变量的作用域的确应该在for语句的末尾结束。然而较旧版本的VC++(现在主流使用的版本基本都符合)却没有完全符合这个标准,它认为for语句头中声明的变量作用域到包含该for语句的最小语句块结束。尽管如此,我们还是应该按照ANSI C++标准来认知变量的作用域。
全局变量是指在整个工程中都可以使用的变量,它通常在公用的标准模块中使用Public进行声明; 如果在窗体中使用Public关键字声明的变量,在当前窗体处于已加载的情况下,在其他窗体中也可以使用,方法是窗体名.变量名,但是他不能被称为全局变量,只能是理解为模块级变量。
优点:
1)全局可见,任何 一个函数或线程都可以读写全局变量-同步操作简单。
2)内存地址固定,读写效率比较高。
缺点:
1)全局变量存放在静态存储区,系统需要为其分配内存,一直到程序结束, 才会释放内存,这一点就局部变量的动态分配,随用随从栈中申请,用完(函数调用完毕)就释放。
2)影响函数的封装性能:我们肯定是希望我们写的函数具有重入性,就如一个黑盒子一般,只 通过函数参数就能得到返回,内部 实现要独立,但是如果函数中使用了全局变量,这势必就破坏了函数的封装性,会造成对全局变量的依赖。
3)降低函数的移值性,原因同上。
4)降低代码的可读性,这也意味着系统维护会不方便,因为一个全局变量可能会出现程序中的各个环节,函数的 执行也会根据环境变化而变化,所以调试会不太方便。
5)全局变量的读写,可能会延迟,这主要是体现在“写”操作上,由于写操作,一般需要2个周期操作,所以有可能会出现,这边没写完时,那边已经读了,结果 读到的不是最终值,这个是一个概率事件,概率 很小,但是并不代表没有。
在数组变量定义时,将变量定义在全局区(非函数内部),就表示定义一个全局变量。在函数内定义的变量是局部变量,而在函数外定义的变量叫做外部变量,外部变量是全局变量。全局变量可以为本文件中其他函数所共用,它的有效范围从定义变量的位置开始到本源文件结束。如:int garr[100] ;char gstr[50]=hello ;全局变量如果没有初始化,则,其内容由系统自动赋值为0。
全局变量的地址,都是编译的时候就由编译器确定好了的,是静态的。
全局变量定义到对应的地址,
举例:
unsigned char temp_A@0x00; //定义无符号变量temp_A,强制其地址为0x00
unsigned char temp_B@0x100; //定义无符号变量temp_B,强制其地址为0x100