头文件互相包含是一种非常见的问题,一旦工程很大,这样的问题比较难排除,特别是间接互相引用的时候。在项目的移植中常常会遇到这些问题,而sourceinsight中又无法查找头文件包含关系,所以特写了一个程序来解决此类问题。我还不知道是否有现成的解决办法,若有欢迎告知。
头文件是否互相包含实际上是查找有向图中是否有环路的问题。思路比较简单,可以定义一个图的结构。考虑到这是一个稀疏图,所以我借助stl中的map和vector来定义一个类似二维的表的结构,这样可以避免使用链表,而且运算效率也不会降低。图的遍历采用广度优先的办法,算法复杂度是O(n3),效率不是太高,但是由于是稀疏图,所以运行速度还是可以接受的。
相应的数据结构:
class Helper
{
private:
//map<CString, set<CString> > m_HeadFiles;
map<CString, vector<CString> > m_HeadFiles;
public:
void OnProcess(const CString& strDir);
void WriteInfo();
int ProcessDir(const CString& strDir);
int ProcessFile(const CString strPath, const CString& strFile);
void Analyse();
};
算法如下:
程序递归查看目录下所有头文件,一旦发现某一行以”#include”开头,就认为它包含了某个头文件,并把这个被包含的头文件放到相应的vector中。
接下来分析间接包含的头文件,代码如下:
void Analyse()