有没有可用的C ++重构工具?[关闭]


161

有谁知道一个功能强大的C ++重构工具,该工具可以与大型代码库(大约100.000行)可靠地工作?

在过去的几年中,我尝试了一次又一次的尝试:SlickEdit,Eclipse CDT。它们都根本不可用。

摘要:我花了一些时间并评估了“ Visual Assist X”以及“ Refactor for C ++”。两者都有一些令人印象深刻的功能,但两者也都远非完美。如果不进行手动修改,提取大块代码通常无法令人满意-因此无法获得回报。

“ Visual Assist X”具有很好的功能,例如更完整的自动完成功能。但是,它会导致大量闪烁,并在某些点上减慢速度。

因此,我认为答案是:“不,没有针对C ++的生产就绪的重构工具”

2015年3月更新 至于hdoghmens今天答复,我尝试使用Resharper for C ++。他的链接 https://www.jetbrains.com/resharper/没有提及C ++。但是我发现一年多以前在这里发布的Resharper C ++:

https://www.jetbrains.com/resharper/features/cpp.html

我使用20MB的代码库尝试了VC2010。

测试1:提​​取方法:导致Resharper异常。没有源代码更改。

测试2:使用不同来源的提取方法:效果很好

测试3:更改提取函数的签名:导致C ++代码损坏:

bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)

也许这就是为什么C ++不在主页上列出。

我认为该问题的答案仍然是“否”


11
喜欢这个。C ++的问题在于其非常复杂的上下文相关语法。如果没有实际解析完整的源代码,就无法确定标识符的含义。
DevSolar


4
Eclipse实际上运行良好,您只需要通过编辑eclipse.ini来允许它使用更多的内存
2009年

3
如果您仍在监视C ++的重构工具,请考虑JetBrains目前正在ReSharper单独的跨平台C ++ IDE中
Jura Gorohovsky

1
@RED SOFT ADAIR,您很有名。检查这个youtu.be/RT46MpK39rQ?t=1611
George

Answers:


38

我发现带有Visual Studio的Visual Assist X非常有用。另一个选择是C ++重构


8
不幸的是,C ++重构在大型代码库中不能很好地工作(如果有的话)。
丹尼尔·罗斯

1
对于C ++和大型代码库,Refactor具体发生了什么?
伊拉·巴克斯特

2
@IraBaxter简直是坏了。重构选项不显示或未完成。有奇怪的错误消息或根本没有。
Daniel Rose

4
即使对于小型代码库,C ++的重构也无法正常工作,它已损坏且根本无法使用。
kovarex 2012年

3
@Nils:您能提供一个具体例子,说明它不明白的地方吗?
Ira Baxter

41

Visual Assist和Visual Studio使处理大型代码库变得更加容易。视觉辅助擅长于跟踪类或成员的使用方式,并且比起搜索和替换,在无误报的情况下更有效地重命名它。


23

我预计在未来几年中,clang将大大改变C ++重构工具的格局。这是一个开放源代码的模块化编译器,它公开了用于解析和语义分析C ++代码的API。IDE和其他工具将能够使用此API,而不必完成编写自己的解析器和语义分析器的艰巨工作。

Google已经使用clang制作了大规模的重构工具


2
但是,是否有某种结果可以让Google之外的凡人使用?
Jan Hudec


17

Mozilla具有自己的名为Pork的重构工具(WikiDeveloper Wiki)。是Pork背后的开发人员博客。据我了解,Pork在Mozilla的重构中成功使用。

如果您来自* nix地带,猪肉应该会有所帮助,对于Visual Studio,我也建议使用Visual Assist。


9

我们的DMS软件再造工具包是一种转换引擎,旨在对包括C ++在内的大型代码体进行复杂的转换。它已用于在数百万行代码的系统上进行可靠的更改。它使用编译器精确的语言分析器和转换器进行操作。

它具有一个具有名称和类型解析度的完整C ++解析器,可构建代码的AST,可以应用过程或源到源的转换(具有C ++表面语法)来修改这些树,并在保留注释的情况下重新生成可编译的输出。(编辑:2011年7月1日:在我们理解该标准的范围内,C ++ 1X现在可以使用了:)

它已用于大规模的重新设计项目,包括C ++组件重新设计以及语言之间100%的全自动翻译。您可以在网站上阅读有关内容。

DMS还用于构建任意源分析工具。示例包括克隆检测,测试覆盖率,智能差异(源代码结构和抽象编辑操作的比较,而不是具有简单插入和删除功能的行的比较)等。

目前(不是)它是一个交互式重构工具。我们认为,要做好大多数重构,您需要深入的控制和数据流分析。DMS具有支持此功能的通用机制,并且该机制目前针对C,COBOL和Java实现,其次是C ++。这是一项艰巨的工作。在解决好此类问题之前,您不会从任何人那里看到许多严肃的C ++重构工具。首先,您需要一个完整的C ++解析器:-}

EDIT 7/5/2011: 看起来我们将在交互式版本中进行尝试。我们已经赢得了能源部第一阶段SBIR的调查,以研究如何做到这一点。 请参阅http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx(在“德克萨斯州”下查找语义设计)。不要急着想结果。这只是进入工具的3年期多年计划的开始。

编辑8/11/2011:第一个进展...我们现在处理所有C ++ 0x和OpenMP指令。

编辑1/4/2012:对C ++代码进行完全控制流分析。

编辑2014年9月15日:现在可以轻松使用C ++ 14前端解析器/转换引擎。即使在这一点上,重命名也相当可靠:-}


在您的下载页面上似乎没有评估该工具的链接语义设计s.com/Products/RegisterEval.html目前,VS2010或VS2008是否提供试用版和价格?
SmacL

对于重构工具,“不要急着要结果”。第一阶段的研发任务已经结束,我们正在为第二阶段申请资金。要讨论DMS及其评估方法,请与公司联系。您不是那种“下载以评估”的东西,就像Enterprise Oracle不是下载项一样。
艾拉·巴克斯特

... DMS能够转换VS2008 / VS2010,但不能转换为交互式工具,并且在预处理器指令方面存在限制。(好消息是我们认为我们已经解决了这些重大问题,并将在第二阶段的研发计划中应用)。
艾拉·巴克斯特

感谢您的反馈,但是看起来不像我想要的那种工具。我不需要交互,只需要交互就可以在大型代码库上执行相当简单的转换,而不必花很多钱,例如,更改调用所用参数的数量,将指针参数更改为引用。VisualAssist已经很接近了,但是只需要更进一步。
SmacL

3
... DMS的目的是实现代码转换的编码和无错误应用,无论是“重构”还是“非”。是的,这很难,我们还没有到那儿。我们比我在C ++中看到的任何其他工具都更接近IMNSHO,而且我们的工具基础也没有错。剩下的就是预处理器,代码规模和努力编写C ++语义以允许进行此类转换的麻烦问题。我将第一个说这是一个大项目。
Ira Baxter

8

如果您使用的是emacs,请尝试Xrefactory。它支持方法提取,类/函数/变量的重命名以及插入/删除/移动参数。它还具有非常好的/快速的代码完成引擎。


6

目前,我不推荐任何用于C ++的重构工具,当然也不适合100k行及以上的大型代码库。我一直希望这种情况会像OP一样发生变化,我希望有一天会有所改变。我担心在我们看到任何真正好的工具之前,语言本身可能必须进行重大更改。

顺便说一句,SlickEdit是否放弃了其重构功能?


随着C ++ 2011标准的发布,语言确实发生了重大变化。额外的复杂性使问题更加艰巨,而不是更加简单,因为所有用户都将需要所有高级语言功能以及重构能力:-{
Ira Baxter

2
最近阅读了Slickedit的功能后,似乎可以通过启发式方法确定与名称的使用相对应的定义。它不会执行“正确”的C ++名称查找。这意味着您不能相信其转换是正确的。如果您不介意检查其工作,那么对您来说可能就可以了。在非常大的软件包上,这可能不是很好。我的看法。
艾拉·巴克斯特

3

DMS软件工具包rengineering做到这一点,我认为。它是一个代码转换引擎,专为大规模设计并处理C ++。不知道输出多么优雅。


1
DMS已被用来自动化大型C ++代码主体的重新组织。参见案例研究:通过自动程序转换对C ++组件模型进行重新设计,信息与软件技术49(3):275 2007年-291可从出版商
艾拉巴克斯特

邓诺(Dunno)你所说的“优雅的输出”。从DMS获得的输出显然取决于您提供的内容以及您应用的转换。如果转换没有涉及到代码的一部分,那么那部分代码是否与开始时一样优雅。如果确实接触到代码,则优雅程度取决于转换的巧妙程度,就像编码人员的手动更改一样。我认为这不是优雅,但是结果的格式可以是“保真”打印(原始格式),也可以是定义的prettyprinting样式。
艾拉·巴克斯特

3

如果您使用emacs并且还没有尝试过,我建议尝试使用rtags(也有vim可用的软件包)。它是基于Clang的客户端/服务器应用程序,它为C / C ++代码编制索引,其中包括以下功能:

  • 转到定义/声明
  • 找到所有参考,转到下一个/上一个
  • 重命名符号
  • 与clang的“ fixits”集成

在观看了介绍我的rtags(和emacs)的演讲后,我决定尝试一下。

(我不得不说,只有在我的QtCreator无法正确重命名一些符号之后,我才走了这么远。

除了rtags支持的功能之外,我还需要一些其他简洁的功能,包括:

  • 创建功能定义/原型
  • 提取功能
  • 创建getter / setter方法

对于这些,我建议对emacs 使用语义重构包(不确定是否有vim的替代品)

通常,基于clang的工具看起来非常有前途。如果您对有关C ++重构的clang工具的更多信息(包括具有大型代码库的项目)感兴趣,那么Chandler Carruth 会进行一些 精彩的演讲。


2

肯定有人会提到Klocwork是一种商业代码重构套件。当您观看演示视频时,它看起来确实很有前途。


2

问题是C ++模板。截至2019年,我还不知道任何支持C ++模板的重构工具。我已经尝试了VS2019,VisualAssist,Clion,QtCreator。

考虑示例:

#include <iostream>

struct foo { void print() {} };
struct bar { void print() {} };

template <typename T>
void call_print(T&& v) { v.print(); }

void print() {}

int main()
{
    call_print(foo{});
    call_print(bar{});
    return 0;
}

如果在上运行Rename Refactoring foo::printbar::print也应自动重命名。因为它们通过call_print功能模板实例化链接。


1

如果您使用的是Visual C ++(Express Edition是免费的),则可以从www.wholetomato.com使用Visual Assist。(链接到C ++重构功能)。

它有30天的试用期,我们发现它比Visual C ++产品本身的内置智能感知功能更快,功能更丰富。


2
我认为您不能在快速版中使用插件
Yacoby

3
我过去肯定曾尝试使用VS C ++ Express安装VA,但是它没有用。
quamrana

您不能以隔离模式安装Visual Studio插件(Express版本均以隔离模式运行IDE)。如果您是学生,则可以DreamSpark或MSDNAA 下载完整版本的Visual Studio 。
Billy ONeal

1

如果您希望重新设计您的代码库:MOOSE。但这是大量分析和再造工具的集合,而不是编辑器。




1

CLion看起来非常有前途。

免责声明:我还没有尝试过,因为我需要将项目转换为CMake格式才能使用它。


1

我建议您尝试Lattix。它使您能够分析大型C / C ++代码库,以发现架构,识别有问题的依赖关系,并重新设计代码以提高模块化并减少技术负担。Lattix还提供了许多算法来帮助重构过程。这些算法可帮助您弄清楚如何将元素从层次结构的一个部分移动到另一部分,以中断周期并移动子系统,从而可以改善子系统的耦合和内聚力。这是Lattix分析Android内核(160万C / C ++的LOC)的结果。全面披露:我为Lattix工作


1

抱歉,这么晚才发现这个问题。我的学生和助手从2006年左右开始从事C ++重构。大多数CDT重构基础结构都是由我在IFS软件学院的团队构建的。几年来,我们为Cevelop提供了CDT版本,它支持C ++代码现代化的重构等。如果工作空间设置正确,Cevelop可以使用大型代码库。可从https://cevelop.com免费获得


很有意思。我下载了它,但它不会启动。请参阅github.com/Cevelop/Issues/issues/84
RED SOFT ADAIR,

0

我为Visual Studio 2013找到了以下插件: Visual C ++重构 Microsoft的。

它只是一个简单的重命名工具,但可以完美地工作。右键单击符号后,它将添加以下上下文菜单:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.