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

问题描述 投票:0回答:3

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

这是一个相当耗费人力的过程,我正在寻找一种工具来帮助我找出哪些标头具有可以前向声明的成员。

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

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

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

class Bar {
.......
private:
    Foo* m_foo;
};
c++ refactoring forward-declaration
3个回答
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 前端执行的所有操作:解析、树构建、名称/类型解析)。 您必须通过遍历 DMS 生成的“内存中”数据结构,以与 GCCXML 和 EDG 相同的方式编写特殊分析代码。 真正不同的是,DMS 可以通过更新内存数据结构中的数据来实际修改源代码,并从这些内存结构中重新生成可编译代码,包括原始注释。


3
投票
pygccxml

包编写一个脚本,它可以为您完成一些分析。 基本上,您可以使用 pygccxml 构建源代码的内存图表,然后使用它来查询您的类和函数,以找出它们实际需要包含的功能。

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

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


3
投票

© www.soinside.com 2019 - 2024. All rights reserved.