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

标签 c++ compiler-construction refactoring forward-declaration

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

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

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

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

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

class Bar {
.......
private:
    Foo* m_foo;
};

最佳答案

任何涉及 C++ 精确分析的事情基本上都需要某个地方的完整 C++ 前端(否则您将无法得到答案,或者它们会出错,并且当您拥有“大型”应用程序时效果不佳)。这里没有太多实用的答案。

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

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

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

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

关于c++ - 重构 C++ 代码以使用前向声明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2297901/

相关文章:

java - Java 编译器插件可以更改已编译程序的 AST。这是黑客攻击还是官方支持?

python - Python 是否像 Perl 的 -c 一样有一个 "compile only"开关?

c++ - 修改dll导出(符号表)。我想混淆函数名称

c++ - 为什么 std::vector 使用 move 构造函数,尽管声明为 noexcept(false)

c++ - 使用 push_back 将 vector<double> 放入 vector<vector<double>>

c++ - 俄罗斯方 block 移动二维数组

c++ - 访问模板类型实例成员

java - 重构嵌套的 if 语句

javascript - 如何在我的应用程序中重构这些 javascript if else 条件语句?

refactoring - Smalltalk 中的多个 if