是否有帮助组织#includes的工具?

是否有任何工具可以帮助组织属于.c或.h文件顶部的#include

我只是想知道因为我正在重新组织我的代码,将各种小函数定义/声明从一个长文件移动到不同的较小文件中。 现在,每个较小的文件都需要位于long文件顶部的#include的子集。

手动弄清楚所有#includes只是烦人且容易出错。 虽然并非所有的#include都存在,但代码通常会编译。 示例:文件A广泛使用std::vector但不包含vector ; 但它目前包括一些不起眼的其他标题,恰好包括vector (可能通过一些递归包含)。

VisualAssistX可以帮助您跳转到类型的定义。 例如,如果在源代码中使用类MyClass,则可以单击它,选择goto定义,VisualAssistX打开包含此类定义的包含文件(可能Visual Studio也可以执行此操作,但此时此操作已得到使用到VisualAssistX,我为VisualAssistX贡献了每个精彩的function:-))。 您可以使用它来查找源代码所需的包含文件。

PC-Lint可以完全相反。 如果您的源中有一个未使用的包含文件,PC-Lint可以向您发出警告,以便您知道可以从源中删除包含文件(这将对您的编译时间产生积极影响) 。

makedepend和gccmakedep

我最近一直在处理这个问题。 在我们的项目中,我们使用C ++,每个类X都有一个Xh和一个X.cpp文件。

我的策略如下:

(1)如果声明了类A的啊,引用了一个类B,那么我必须包含头Bh如果类A的声明只包含类型* B,那么我只需要一个前向声明类B; 在啊我可能需要在A.cpp中包含Bh

(2)使用上述程序,我尽可能多地从Ah移动到A.cpp。 然后我尝试一次删除一个包含,看看.cpp文件是否仍然编译。 这应该允许最小化.cpp文件中包含的文件集,但我不能100%确定结果是否最小。 我也认为可以编写一个工具来自动执行此操作。 我已经开始为Visual Studio编写一个。 我很高兴知道有这样的工具。

注意 :可能添加具有良好定义的导入/导出关系的适当模块构造可能是C ++ 0x的理想添加。 这将使重组import的任务变得更加容易,并加快编译速度。

由于这个问题已被提出,因此创建了一个新工具: include-what-you-use ,它基于clang,提供映射来伪造某些符号的存在( unique_ptrmemory ,但实际上是在bits/unique_ptr.h定义的)在一些标准标题中,您可以提供自己的映射。

它提供了良好的诊断和自动重写。

Now each of the smaller files needs a subset of the #includes that were at the top of the long file.

我使用VisualAssistX执行此操作。 首先编译文件以查看缺少的内容。 然后,您可以使用VisualAssistX的添加包含function。 所以我只需右键单击我知道需要包含的函数或类,然后单击Add Include。 重新编译几次以过滤掉新的缺失包含并完成。 我希望我写的可以理解:)

不完美,但比手工操作更快。

我使用doxygen / dot-graphviz生成的图表来查看文件的链接方式。 非常方便,但不是自动的,您必须目视检查图形,然后编辑代码以删除不必要的“#include”行。 当然,并不适合非常大的项目(比如> 100个文件),图表变得无法使用。