今天在看华为C语言面试题的时候重温了一下全局变量的一些知识,这里记录一下静态和非静态全局变量中最大的一个区别。
摘录一个网上关于其只是的区别说明:
全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也是静态存储方式。
这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序, 当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效, 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用, 因此可以避免在其它源文件中引起错误。从以上分析可以看出, 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域, 限制了它的使用范围。
好了我们开始来实践:
编写一个a.h头文件:
[code="cpp"]
#ifndef A_H
#define A_H
#ifdef __cplusplus
extern "C" {
#endif
int statica;
void func();
#ifdef __cplusplus
}
#endif
#endif /* A_H */
[/code]
注意头文件中我们没有申明statica变量为static,然后编写一个main.c和test.c文件
main.c
[code="cpp"]
#include
#include
#include"a.h"
using namespace std;
int main(int argc, char** argv) {
statica = 3;
func();
printf("%d",statica);
}
[/code]
test.c
[code="cpp"]
#include"a.h"
void func(){
statica = 4;
}
[/code]
运行后可以看出printf得出的是4,那么说明func函数跨文件修改了main.c中非静态全局变量的值,
然后加上static对statica变量的申明再次运行,可以得出输出的指为3,说明test.c的func没有对main.c中的statica变量产生干扰,这样可以利用static申明有效屏蔽多文件中共享同一个头文件时有可能导致的全局变量被不断覆写的问题。