有哪些工具可以帮助整理#include语句?

25

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

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

手动找出所有 #include 很麻烦且容易出错。通常情况下,即使没有所有 #include,代码也会编译通过。例如:文件 A 广泛使用 std::vector,但没有包括 vector;但它当前包含了其他一些晦涩的头文件,这些文件可能经过一些递归包含而包含了 vector


我在Eclipse CDT网站上发现了关于这个问题的讨论:http://wiki.eclipse.org/CDT/C_editor_enhancements/Include_management - Frank
6个回答

2
VisualAssistX可以帮助您跳转到类型的定义。例如,如果您在源代码中使用一个名为MyClass的类,则可以单击它,选择“转到定义”,VisualAssistX会打开包含该类定义的头文件(可能Visual Studio也可以做到这一点,但我已经习惯了VisualAssistX,并将其所有精彩功能都归功于VisualAssistX :-)). 您可以使用此功能查找源代码所需的头文件。
PC-Lint恰好相反。如果您在源代码中有一个未被使用的头文件,PC-Lint会警告您,以便您知道可以从源代码中删除该头文件(这将对编译时间产生积极影响)。

1

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

我的策略如下:

(1) 如果A.h(其中声明了类A)引用了类B,则我必须包含头文件B.h。 如果类A的声明仅包含类型*B,则我只需要在A.h中进行前向声明class B;。我可能需要在A.cpp中包含B.h

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

注意:也许添加一个具有明确定义的导入/导出关系的适当模块结构可能是C++0x的期望补充。这将使重新组织导入的任务更加容易,并大大加快编译速度。


1
自从这个问题被提出之后,已经创建了一个新的工具:include-what-you-use,它基于clang,提供了映射来模拟某些符号的存在(如memory中的unique_ptr,但实际上在一些标准头文件bits/unique_ptr.h中定义),并允许您提供自己的映射。它提供了良好的诊断和自动重写功能。

1
现在每个较小的文件都需要长文件顶部的#includes的子集。
我使用VisualAssistX完成这项工作。首先编译文件以查看缺少什么。然后可以使用VisualAssistX的添加包含函数。所以我只需右键单击我知道需要包含的函数或类,然后点击添加包含。重新编译几次以过滤新的缺失包含并完成任务。希望我写得清楚明白 :)
不是完美的,但比手动完成要快。

1

3
我认为你提出的问题是无法逆转的。例如,我可以运行一个程序,告诉我foo.c文件中EOF未定义。我也可以机械地确定EOFlibio.h, stdio.h和(例如)foo.h中被定义。我应该包含哪个? - msw
4
你提出了一个有力的观点。然而,工具仍然可以根据包含路径中存在哪些标题,甚至是哪些标准(或流行)的标题来提出建议。 - Matthew Flaschen
2
了解哪些包含的头文件对编译没有影响也是很有用的。当然,可以逐个删除头文件并进行编译,但肯定有更简单的方法。这将捕捉到一个常见情况,即在早期版本中需要的头文件现在已经不再需要了。 - RBerteig
@RBerteig:一种可能的方法是编写一个工具,逐行删除包含行并尝试编译源程序。如果在删除包含后没有错误,则可以删除该包含。 - Giorgio
@Giorgio,我也希望回归测试能够通过。我见过包含文件,如果以不破坏编译的方式包含,则会更改语义。我不认为任何标准包含文件会这样做,但是... - RBerteig
显示剩余3条评论

0

我使用由doxygen/dot-graphviz生成的图表来查看文件之间的链接关系。非常方便,但不是自动的,您必须目视检查图表,然后编辑代码以删除不必要的“#include”行。当然,这对于非常大型的项目(例如>100个文件)并不是很适用,因为图表会变得难以使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接