检查头文件是否互相包含

本文介绍了一个用于检查头文件互相包含问题的程序,该程序通过建立有向图模型,利用广度优先搜索算法查找环路。通过递归遍历目录下所有头文件,分析间接包含关系,有效检测头文件的循环引用。程序还展示了如何处理包含关系的代码,以及运行结果和可能的误判情况。
摘要由CSDN通过智能技术生成

头文件互相包含是一种非常见的问题,一旦工程很大,这样的问题比较难排除,特别是间接互相引用的时候。在项目的移植中常常会遇到这些问题,而sourceinsight中又无法查找头文件包含关系,所以特写了一个程序来解决此类问题。我还不知道是否有现成的解决办法,若有欢迎告知。

头文件是否互相包含实际上是查找有向图中是否有环路的问题。思路比较简单,可以定义一个图的结构。考虑到这是一个稀疏图,所以我借助stl中的mapvector来定义一个类似二维的表的结构,这样可以避免使用链表,而且运算效率也不会降低。图的遍历采用广度优先的办法,算法复杂度是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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值