有没有工作的C ++重构工具?
有人知道一个全function的C ++重构工具,可以与大型代码库(大约100.000行)可靠地工作吗?
在过去的几年中,我尝试了一次又一次的寻找:SlickEdit,Eclipse CDT。 他们都没有用。
总结 :我花时间评估了“Visual Assist X”以及“C ++重构”。 两者都有一些令人印象深刻的特征,但都不是很完美。 如果不进行手动修改,提取大块代码通常是不会令人满意的,因此不会付账。
“视觉辅助X”具有很好的function,比如更完整的自动补偿等等。但是它会导致太多的闪烁,并在某些点上变慢。
因此,我认为答案是:“不,C ++没有生产就绪的重构工具”
UPDATE 2015年3月至于hdoghmens回复今天我试过Resharper的C + +。 他的链接https://www.jetbrains.com/resharper/并没有提到有关C ++的任何信息。 但是我发现一年多以前宣布的Resharper C ++在这里:
https://www.jetbrains.com/resharper/features/cpp.html
我使用20MB的代码基于VC2010试了一下。
testing1:提取方法:导致Resharperexception。 没有源代码改变。
testing2:不同来源的提取方法:工作正常
testing3:改变提取function的签名:结果在破碎的C ++代码:
bool myclass::do_work123(<unknown long Color>int& Filled*&, long, int&)
也许这就是为什么C ++没有在主页上列出。
我认为这个问题的答案仍然是“否” 。
我发现与Visual Studio Visual Assist X非常有用。 另一个select是重构C ++ 。
Visual Assist和Visual Studio使处理大型代码库变得更容易。 视觉辅助function可以很好地追踪class级或成员的使用情况,并且在重新命名时不会发生误报,而不是search和replace。
我预计在未来几年内, clang将会显着改变C ++重构工具的格局。 它是一个开放源码的模块化编译器,公开了一个用于parsing和语义分析C ++代码的API。 IDE和其他工具将能够使用这个API,而不是编写自己的parsing器和语义分析器。
Google已经用clang制作了一个大型的重构工具 。
Mozilla有自己的重构工具Pork( Wiki , Developer Wiki )。 这是Pork开发者的博客。 从我读过的东西猪肉成功地在Mozilla的重构中使用。
猪肉应该帮助,如果你来自*尼克斯土地,对于Visual Studio我也推荐Visual Assist。
如果您使用的是emacs,请尝试Xrefactory 。 它支持方法提取,类/函数/variables的重命名以及插入/删除/移动参数。它还具有非常好的/快速的代码完成引擎。
我们的DMS Software Reengineering Toolkit是一个转换引擎,用于对大量代码进行复杂的转换,包括C ++。 它已被用于在数百万行代码的系统上进行可靠的更改。 它通过使用编译器精确的语言分析器和变换器进行操作。
它有一个完整的名为和typesparsing的C ++parsing器,构build代码的AST,可以应用程序或源到源的转换(用C ++表面语法)来修改这些树,并用保留的注释重新生成可编译的输出。 (编辑:2011年7月1日:现在,我们了解标准:) C ++ 1X
它已经被用于大规模的重新devise项目,包括C ++组件的重新devise,以及100%全自动的语言翻译。 你可以在网站上阅读这个。
DMS也被用来构build任意的源代码分析工具。 例子包括克隆检测,testing覆盖率,智能差异(比较源代码结构和抽象编辑操作,而不是简单的插入和删除行)等。
它不是(目前)是一个交互式重构工具。 我们相信要做好大部分的重构,需要深入的控制和数据stream分析。 DMS拥有通用的机制来支持这一点,并且此时C ++,COBOL和Java都实现了这个机制,而C ++则处于下一个版本。 这是一项艰巨的工作。 在这种问题得到很好解决之前,你不会看到很多严重的C ++重构工具。 首先你需要一个完整的C ++parsing器: – }
编辑7/5/2011: 看起来我们要在互动版本上运行。 我们赢得了能源部第一阶段SBIR调查如何做到这一点。 请参阅http://science.energy.gov/sbir/awards-and-general-stats/fy-2011/phase-i-by-state/?p=1#tx (在“Texas”下查找语义devise)。 不要期盼结果, 这只是三阶段多年期计划的开始。
编辑8/11/2011:第一个进展…我们现在处理所有的C ++ 0x和OpenMP指令。
EDIT 1/4/2012:完全控制C ++代码的stream程分析。
编辑9/15/2014:现在有了C ++ 14前端parsing器/转换引擎。 即使在这一点上重新命名相当可靠: – }
目前我不能推荐任何 C ++的重构工具,当然不适用于10万行及以上的大型代码库。 我一直希望这会改变,像OP,我希望有一天会有一些东西。 我担心,在我们看到任何真正好的工具之前,语言本身可能不得不发生重大变化。
顺便说一句,SlickEdit已经放弃了它的重构function?
DMS软件重组工具包就是这样做的。 这是一个代码转换引擎,为大规模devise和处理C ++。 不知道输出是多么优雅。
肯定不得不提到Klocwork作为一个商业代码重构套件。 演示video时,看起来非常有希望。
如果你使用emacs,并且还没有尝试过,那么我build议你尝试一下rtags (还有一个可用的vim 包 )。 这是一个基于铿锵的客户端/服务器应用程序,其索引C / C ++代码,这些function包括:
- 去定义/声明
- find所有的引用,转到下一个/上一个
- 重命名符号
- 与叮当的“固定”
看了这个为我介绍rtags(和emacs)的演讲后,我决定尝试一下。
(我必须说,只有在我的QtCreator没有正确地重新命名一些符号之后,我才走到了这一步,这对于我现在使用这个伟大的IDE来说是一个阻碍)
除了rtags支持的内容外,我还需要一些额外的整洁function,包括:
- 创build函数定义/原型
- 提取function
- 创buildgetter / setter方法
对于这些,我build议使用emacs的语义重构包(不确定是否有替代vim)
一般来说,铿锵的工具看起来非常有前途 如果您有兴趣了解更多有关C ++重构的clang工具的信息,包括大代码库的项目,Chandler Carruth会进行一些 精彩的演讲。
如果您使用Visual C ++(Express Edition是免费的),则可以使用www.wholetomato.com上的Visual Assist (链接到C ++重构function)。
它有30天的试用期,我们发现它在Visual C ++产品本身内置的intellisense更快,function更全面。
如果你想重新devise你的代码库:MOOSE。 但这是一个大量的分析和重新devise工具,而不是编辑器。
现在有一个来自Microsoft的Visual Studio 2013的C ++重构扩展: http : //visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194
CLion看起来很有希望。
免责声明:我还没有尝试过,因为我需要将我的项目转换为CMake格式才能使用它。
Definetely Resharper终极是要走的路。 快乐保证:)
截至2015年3月的Beta版本。
我发现了Visual Studio 2013的以下插件:Microsoft Visual C ++重构 。
这只是一个简单的重命名工具,但它的工作完美无瑕。 右键单击符号后,添加以下上下文菜单:
我build议你试试Lattix 。 它允许您分析大型C / C ++代码库,以发现构架,识别有问题的依赖关系,并重新devise代码以改善模块化并减less技术债务。 Lattix还提供了许多algorithm来帮助重构过程。 这些algorithm可以帮助您了解如何将元素从层次结构的一个部分移动到另一个层次,打破循环和移动子系统,从而改进子系统的耦合和聚合。 下面是Lattix分析Android Kernel (C / C ++的160万LOC)的结果。 充分披露:我为Lattix工作