减少文件之间的编译依赖
在实际来发过程中,经验略少的开发者经常遇到这样的问题:只对一个头文件中的定义进行了简单的修改,却
导致很多文件的重新编译,浪费了大量的时间。这种使人厌烦的问题是由于那些文件依赖了(#include)你修
改的头文件,当然,依赖是迟早的事,但是有什么好的解决办法减少没必要的编译动作呢?下面进行讲述。
最根本的出发点是尽量避免在.h 文件中包含(#include)其他的.h 文件,这样在对某一.h 文件进行修改后,
不会对另一个.h 文件产生影响,从而避免多余的编译动作。比较抽象,举例说明:比如有两个.h 文件,a.h
和.h,还有一个.cpp 文件 c.pp,其依赖于 b.h 文件。如果 b.h 文件依赖于 a.h 文件,在对 a.h 进行修改后会导
致 b.h 的#include 内容发生变化,尽管其内容并未修改,但在编译过程中会使得 c.cpp 重新编译。
下面讲述几种常用的解决方法:
1 使用类的前向声明:
基本思路是利用类的指针取代类的对象。因为不管何种类型,指针所占内存是固定大小的(不同平台下有
所不同),基本形式如下:
//*******a.h
class CAddress
{
public:
string m_strAddr;
};
//******b.h
#include “a.h”
class CStudent
{
private:
string m_strName;
char m_age;
CAddress m_cAddress;
};
class CShool
{
private:
string m_strName;
};
//******c.cpp
#include “b.h”
int main()
{
CShool shool;
return 0;
}
代码如上所示,此时对 a.h 进行修改:
//*******a.h
class CAddress
{
public:
string m_strAddr;
int m_numDoor;
};
尽管此时并未使用 a.h 中的类,再次编译时,也会导致 c.cpp 再次编译,而其与 a.h 无之间联系。问题就
出在 b.h 中有#include “a.h”。
下面我们通过”前向声明“对 b.h 进行修改,如下:
//******b.h
//! 前向声明