停停停,学的越来越离谱了。
我们必须再次审视一下问题,尽可能清晰全面一点。
- 假如,我想多文件使用一组变量,我该如何实现?
例如,01.h,02.h,01.cpp,02.cpp,main.cpp都要用到a变量
假如我在01和02的cpp文件都要使用变量a,我可以在对应的.h文件中使用引用声明extern(此时未开内存)且不进行初始化,
如果在01.cpp文件中我定义一个a(此时开内存了)并且为它赋值(例如100),那么如果在01或02的cpp文件里不在修改,
那它的值就固定了,就是100
- 假如,我想多文件使用一组常量,我该如何实现?
就是1问题的操作,外加一个const
- 在问题2的基础上,假如,我不加extern呢?
在01和02的cpp文件都要使用常量a,我可以在对应的.h文件中使用定义:const int a = 100;
然后在包含进main函数使用,那么,在mian文件中,将包含进去两条,const int a = 100;
这将违反但定义原则。对于问题1,不使用const同样解释,同样出错
- 那static呢?他有什么用?
在全局变量上,似乎没有什么影响,仍然是01.h文件定义一个static int a = 100;
,02.h文件再定义一次的话,main.cpp文件启动了就仍然是重定义。那为什么有内部链接性呢?什么是当前翻译的单元可见?
内部链接性就是说,当在一个文件里定义一个static变量后,那么别的文件无法通过同名的引用声明(带extern)来访问它,
它只在static的文件访问。
//总结
- 那也就是说,对于一个全局的变量,它必然存活到程序结束,如果你想多文件访问它,
那你就在某个文件中定义(开内存,赋值)它,在使用它的文件里使用引用声明(不开内存,引用它)来访问它(更多是从常量的角度出发),
当然也可以反过来用:在用到的文件里先声明它,然后通过定义(开内存,赋值)同名变量,来使用这块内存(更多是从变量的角度出发)
但无论从哪个角度出发,extern的变量都是全局变量,都在全局的内存区域存着
至于出现的重定义(违反单定义原则)问题,那就是多文件定义同名变量,只要对同名变量没有在第二次使用extern的都会出错
特别是多文件的时候要注意
- 代码块内部定义一个变量加一个static有什么用?
除了活得更久,如果能取到内存的话。。。访问不了,无法解析。。。
思考一下,好比01.h和02.h文件都有extern int a;,然后,在01.cpp和02.cpp都有先定义和修改定义a的函数,
那么在main函数,多次交替调用修改函数,a的内存变不变??
- 果然,对应的.cpp文件也不可以定义它,现在我在main函数定义它,在1.cpp和02.cpp只有修改它的值的函数
- 果然,内存开在一个空间(因为就开了一次开多次不允许😂),值也被修改了。
- 那如果,定义的是在方法内部呢??会奏效吗??
- 我去,开的内存还是那一块,也就是说,extern是优先的,定义也只能在代码块外部定义,否则不行。