C++ 是否有帮助组织的工具?

C++ 是否有帮助组织的工具?,c++,c,header-files,code-organization,C++,C,Header Files,Code Organization,是否有任何工具可以帮助组织属于.c或.h文件顶部的#includes 我只是想知道,因为我正在重新组织代码,将各种小函数定义/声明从一个长文件移动到不同的小文件中。现在,每个较小的文件都需要位于长文件顶部的#include的子集 手工算出所有包含的内容是很烦人和容易出错的。通常,即使不是所有的#include都在那里,代码也会编译。示例:文件A广泛使用std::vector,但不包括vector;但它目前包含一些模糊的其他标题,这些标题碰巧包含向量(可能通过一些递归包含)。和VisualAsis

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

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


手工算出所有包含的内容是很烦人和容易出错的。通常,即使不是所有的
#include
都在那里,代码也会编译。示例:文件A广泛使用
std::vector
,但不包括
vector
;但它目前包含一些模糊的其他标题,这些标题碰巧包含
向量(可能通过一些递归包含)。

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


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

我使用doxygen/dot graphviz生成的图形查看文件的链接方式。非常方便,但不是自动的,您必须直观地检查图形,然后编辑代码以删除不必要的“#include”行。当然,这并不适用于非常大的项目(比如>100个文件),因为在这些项目中,图形变得不可用。

我最近一直在处理这个问题。 在我们的项目中,我们使用C++,并且对于每个类x.< /p>有一个x.h和一个x.cpp文件。 我的策略如下:

(1) 如果声明A类的A.h指的是B类,则 我必须包括标题B.h。 如果类A的声明只包含*B类型,那么我只需要 远期申报B类在A.h.我可能需要在A.cpp中包含B.h

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


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

由于提出了这个问题,因此创建了一个新的工具:,它基于叮当声,提供映射以伪造某些符号的存在(
unique_ptr
memory
中,但实际上是在一些标准头中的
bits/unique_ptr.h
中定义的,并允许您提供自己的映射


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

现在,每个较小的文件都需要位于长文件顶部的#include的子集。

我使用VisualAsistX来实现这一点。首先编译文件以查看缺少的内容。然后您可以使用VisualAsistX的Add-include函数。因此,我只需右键单击我知道需要包含的函数或类,然后点击Add-include。重新编译几次以过滤掉新缺少的包含,就完成了。我希望我在下面写的可以说:)


不完美,但比手工做得快。

好主意,但可能不是我真正需要的。我想一个工具告诉我应该包括什么,即使我还没有添加一个包含(java和朋友会在这种情况下出错)。伊柯丽斯为Java做了这件事(也许也用于C++)?.MakeDependen还告诉我每个编译单元(
.o
文件)的依赖关系,但不是某个头文件应该包含的内容。我认为您提出的问题是无法解决的。例如,我可以运行一个程序,告诉我
EOF
foo.c
中未定义。我还可以机械地确定EOF在
libio.h
stdio.h
和(例如)
foo.h
。我应该包括哪些?您提供了一个有效的观点。但是,工具仍然可以根据包含路径中存在哪些标题,甚至哪些标题是标准的(或流行的)提出建议。了解包含的哪些头文件对编译没有影响也很有用。当然,可以一次删除一个头文件并进行编译,但必须有一种更简单的方法。这将捕获早期版本中需要的头文件的常见情况,但现在不需要。@RBerteig:一种可能性是te一个工具,可以逐个删除包含行并尝试编译源程序。如果删除包含后没有错误,则可以删除该包含。我在Eclipse CDT站点上发现了关于此问题的讨论: