是否有帮助组织#includes 的工具?
Posted
技术标签:
【中文标题】是否有帮助组织#includes 的工具?【英文标题】:Are there tools that help organizing #includes? 【发布时间】:2011-04-08 08:11:42 【问题描述】:是否有任何工具可以帮助组织 .c 或 .h 文件顶部的 #include
s?
我只是想知道,因为我正在重新组织我的代码,将各种小函数定义/声明从一个长文件移动到不同的小文件中。现在每个较小的文件都需要位于长文件顶部的#include
s 的子集。
手动找出所有#include 既烦人又容易出错。即使不是所有的#include
s 都在那里,代码通常也会编译。示例:文件 A 广泛使用std::vector
,但不包括vector
;但它目前包含一些模糊的其他标头,恰好包含vector
(可能通过一些递归包含)。
【问题讨论】:
我在 Eclipse CDT 站点上找到了关于这个问题的讨论:wiki.eclipse.org/CDT/C_editor_enhancements/Include_management 【参考方案1】:VisualAssistX 可以帮助您跳转到类型的定义。例如。如果你在源代码中使用了 MyClass 类,你可以点击它,选择 goto definition,VisualAssistX 会打开包含这个类定义的包含文件(可能 Visual Studio 也可以这样做,但此时我已经习惯了VisualAssistX,我为 VisualAssistX 贡献了每一个精彩的功能 :-))。您可以使用它来查找源代码所需的包含文件。
PC-Lint 可以完全相反。如果您的源代码中有一个包含文件未被使用,PC-Lint 可以警告您,以便您知道可以从源代码中删除包含文件(这将对您的编译时间产生积极影响) .
【讨论】:
【参考方案2】:makedepend 和 gccmakedep
【讨论】:
好主意,但可能不是我所需要的。我想要一个工具来告诉我应该包含什么,即使我还没有添加一个包含(makedepend 和朋友在这种情况下会给出错误)。 Eclipse 为 Java 做到这一点(也许 C++ 也是如此?)。另外,makedepend 告诉我每个编译单元(.o
文件)的依赖关系,但不是某个头文件应该包含的内容。
我认为你提出的问题是不可逆转的。例如,我可以运行一个程序,告诉我EOF
在foo.c
中未定义。我还可以机械地确定 EOF 是在libio.h
、stdio.h
和(例如)foo.h
中定义的。我应该包括哪些?
你提出了一个有效的观点。但是,工具仍然可以根据包含路径中存在哪些标头,甚至可能是标准(或流行)的标头提出建议。
了解包含的哪些头文件对编译没有影响也很有用。当然,可以一次删除一个标头并进行编译,但必须有一种更简单的方法。这将捕获早期版本中需要的标题的常见情况,但现在不需要了。
@RBerteig:一种可能性是编写一个工具,逐一删除包含行并尝试编译源程序。如果删除包含后没有错误,则可以删除该包含。【参考方案3】:
我最近一直在处理这个问题。 在我们的项目中,我们使用 C++,每个类 X 有一个 X.h 和一个 X.cpp 文件。
我的策略如下:
(1) 如果声明类 A 的 A.h 引用类 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 的理想添加。这将使重组导入的任务变得更加容易并大大加快编译速度。
【讨论】:
【参考方案4】:因为这个问题已经被问到,一个新的工具已经被创建:include-what-you-use,它基于clang,提供映射来伪造某些符号的存在(memory
中的unique_ptr
,但实际上在@987654324中定义@ 在一些标准标题中,并允许您提供自己的映射。
它提供了很好的诊断和自动重写。
【讨论】:
【参考方案5】: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 功能。所以我只需要右键单击我知道需要包含的函数或类,然后点击添加包含。重新编译几次以过滤掉新的缺失包含并完成。我希望我写的可以理解:)
并不完美,但比手工操作要快。
【讨论】:
【参考方案6】:我使用 doxygen/dot-graphviz 生成的图表来查看文件是如何链接的。非常方便,但不是自动的,您必须直观地检查图表,然后编辑您的代码以删除不必要的“#include”行。当然,它并不适合非常大的项目(比如 > 100 个文件),因为在这些项目中图表变得无法使用。
【讨论】:
以上是关于是否有帮助组织#includes 的工具?的主要内容,如果未能解决你的问题,请参考以下文章