出发点
- 我希望能将配置变量全都声明在一个文件中,这样主要程序代码的文件就不会很紊乱(很多全局变量要放在所有函数外面,也就是文件最前面定义)
C
- 在一个cpp中声明,在另一个文件中使用extern声明,然后就可以直接调用了
- 但是这样,并不能解决主文件很乱的问题
- 另一方面,轮子哥等众人也不建议这么做(如果多文件的话,很多人会倾向于在头文件中进行extern声明,然后包含头文件吧,但是头文件中定义变量是很业余的做法)
- 推荐的方法就是:
//foo.C
Foo& getFoo() {
static Foo foo;
return foo;
}
//foo.H
Foo& getFoo();
使用get()而不是直接使用静态变量是为了防止不同编译器初始化顺序不同,至于内存泄漏检查之类的,以后再看吧…
- 关于extern和static的事情,更多的可以看refer
python
- 利用函数的局部静态变量 + import 达到全局变量共享
- 代码想要写得好看,可以参考使用property修饰符
补充
-
什么是编译单元?
当一个c或cpp文件在编译时,预处理器首先递归包含头文件,形成一个含有所有 必要信息的单个源文件,这个源文件就是一个编译单元。
这个编译单元会被编译成为一个与cpp 文件名同名的目标文件( .o (linux系统) 或是.obj(windows系统) ) 。连接程序把不同编译单元中产生的符号联系起来,构成一个可执行程序。
可以把它理解为:#include完头文件的内容后(即将头文件的内容粘贴到cpp中之后)的cpp文件就是编译单元。简单说,一个编译单元就是一个经过预处理的cpp文件。 -
声明可以多次,定义只有一次,只有定义的时候才会分配内存
-
extern
1). extern是声明,如果extern a=xx ,那么相当于没有extern(直接定义了)。2). 此外,有了extern,就不需要#include "xx.h"了
-
static
1). extern和static不能同时修饰一个变量
2). static修饰的全局变量声明与定义同时进行(这是必须的),也就是说当你在头文件中使用static声明了全局变量后,它也同时被定义了
3).static修饰全局变量的作用域只能是本身的编译单元,也就是说它的“全局”只对本编译单元有效,其他编译单元则看不到它【所以使用get方法~】 -
const
1). 看特性我觉得可以用来当作全局的配置变量的声明和定义,但是还没看完 ,链接如下:https://blog.youkuaiyun.com/you1314520me/article/details/12996013