一般情况下为了解决头文件重复包含的问题,有两种解决方法:条件编译和#pragma once;
但是这种只能解决程序编译时的变量重复定义问题。在这里我们要注意一点,变量,函数,类,结构体的重复定义不仅会发生在源程序编译的时候,在目标程序链接的时候同样也有可能发生。我们知道c/c++编译的基本单元是.c或.cpp文件,各个基本单元的编译是相互独立的,#ifndef等条件编译只能保证在一个基本单元(单独的.c或.cpp文件)中头文件不会被重复编译,但是无法保证两个或者更多基本单元中相同的头文件不会被重复编译。
一个小问题
在a.h中试图定义一个全局变量A,并且在a.cpp中进行了初始化;
b.cpp中包含了a.h,并且试图使用全局变量A;
即使在两个源文件中都添加了#pragma once,两个源文件编译可以正常进行,但是链接的时候依然会提示变量A重复定义;
尝试解决
在a.h头文件中将变量A加上static限制。确实可以正常编译链接了,但是b.cpp中访问变量A的值是空的。
分析:static具有隐藏变量全局属性的作用,使得变量仅对当前文件可见。所以加上了static关键字后,A变量相当于在a.cpp和b.cpp分别存在一块内存。所以在a.cpp中操作A的值并不会影响b.cpp中的变量值。
解决方案
目标是b.cpp和a.cpp能共享全局变量A,所以在a.cpp中定义全局变量A,在a.h头文件中extern声明一下A,然后在b.cpp中通过引用a.h就可以直接使用变量A了。