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

时间:2010-09-04 22:56:35

标签: c++ c header-files code-organization

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

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

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

6 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

答案 2 :(得分:1)

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

我的策略如下:

(1)如果A.h,其中声明了A类,则指的是B类     我必须包括标题B.h.     如果A类的声明只包含* B类型,那么我只需要一个     A.h.中的前向声明 B类; 我可能需要在A.cpp中包含B.h

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

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

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

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

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

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

答案 5 :(得分:0)

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