问题出现的原因
为什么会出现这种情况呢?
首先单个文件的编译是独立的。在head.cpp编译到head.obj,main.cpp编译到main.obj.这个过程没有报错,也就是说明编译过程是没有问题的。
接下来是obj的链接。在链接main.obj与head.obj的时候,此时编译器发现head.obj为这些全局变量分配了内存空间,而在main.obj中也为这些全局变量分配了内存空间。
同样一个变量却出现了两个不同的内存地址。于是编译器报错。
不是办法的办法
把head.h里面的头文件的全局变量都加上static.编译便可通过,可是却会不经意出现了其他问题。
static只是把变量的生存周期延长,同时也把该变量限定于当前的文件。而之所以能用于main.cpp中,是因为在编译的时候复制了一个变量名相同的变量给main.cpp而已。那么main.cpp里面的“全局变量”的改变,并不能改变原来head.h里面的全局变量的值。
这样子虽然编译通过了,但是程序是错误的。
真正的解决方法
把全局变量定义放到head.cpp文件中。
在head.h存放全局变量的声明,同时每个声明前用extern去修饰。
我的个人想法
我觉得为了能更加分离全局变量,可以做的一个做法是:
全局变量定义依旧放在head.cpp中。
新建一个global.h的头文件,存放全局变量的声明,同时每个声明前用extern去修饰。
在其他文件需要用到全局变量的时候,将global.h头文件#include进来。
更多武汉IT培训相关资讯,请扫描下方二维码