重构C++代码以使用前向声明

Gle*_*len 19 c++ compiler-construction refactoring forward-declaration

我有一个很长的代码库已经存在了一段时间,我试图通过重构来整理它.我想做的一件事是找到我可以转发声明成员的所有标题,而不是包括整个头文件.

这是一个相当费力的过程,我正在寻找一个工具,可以帮助我找出哪些标题包含可以向前声明的成员.

是否有编译器设置可能会发出警告或建议以下代码可以使用前向声明?我正在使用以下编译器icc,gcc,sun studio和HP的aCC

是否有可以完成相同工作的独立工具?

#include "Foo.h"
...//more includes

class Bar {
.......
private:
    Foo* m_foo;
};
Run Code Online (Sandbox Code Playgroud)

Ira*_*ter 5

任何涉及 C++ 精确分析的事情本质上都需要在某个地方有一个完整的 C++ 前端(否则你不会得到答案,或者它们会是错误的,当你有“大型”应用程序时,这会很糟糕)。这里没有太多实用的答案。

已经提到的是 GCCXML 是一个 GCC 派生包,因此它具有必需的 C++ 前端。它生成 XML,因此它会生成大量输出,您必须读回这些输出以形成另一个答案中建议的“内存数据结构”。不幸的是,GCCXML 已经构建了该内存数据结构,然后将其导出为 XML,并迫使您再次构建它。当然,您可以只使用 GCC,它构建内存中的数据结构,但是您必须将 GCC 改造为您想要的,而且它真的非常想成为一个编译器。这意味着您将面临一场斗争,让其屈服于您的意愿(并解释了 GCCXML 存在的原因:大多数人不希望这场斗争)。

没有提到的是 Edison Design Group C++ (EDG) 前端,它直接在内存数据结构中构建该前端。它是一个前端;您必须自己完成所有分析工作,但您的任务可能很简单,因此并不难。

我知道的最后一个解决方案是我的:C++ FrontEnd for DMS。DMS 是构建程序分析的基础,其 C++ 前端是一个完整的 C++ 前端(例如,执行 GCC 和 Edison 前端所做的所有操作:解析、树构建、名称/类型解析)。您必须像针对 GCCXML 和 EDG 那样,通过遍历 DMS 生成的“内存中”数据结构来编写特殊分析代码。

真正不同的是,DMS 可以通过更新内存数据结构中的数据来实际修改源代码,并从这些内存结构中重新生成可编译代码,包括原始注释。


jkp*_*jkp 3

我不确定您是否会找到任何开箱即用的工具,但一种选择是使用 Python 和pygccxml包编写一个脚本,它可以为您完成一些分析。

基本上,您可以使用 pygccxml 构建源代码的内存图表,然后使用它来查询您的类和函数,以找出它们实际需要包含的功能。

因此,例如,您可以询问每个类,给我指针类型的成员:然后对于每个指针类型,您可以计算出接口中是否使用了该类的真实实例(非指针),如果不是,您可以计算出可以将其标记为前向声明的候选者。

缺点是脚本需要一些时间才能正确,因此成本可能超过收益,但这至少是一个有趣的练习。如果你有一些有用的东西,你可以将你的代码发布到 Github,也许其他人会发现它有用。