为什么Visual C ++缺少重构功能?

时间:2008-12-12 16:34:28

标签: c++ visual-studio visual-studio-2008 visual-c++

在Visual Studio 2008中使用C ++编程时,为什么在使用C#时没有像重构菜单中看到的那样的功能?

我经常使用重命名,当它不存在时你真的很想念它。我确信你可以获得提供这个的插件,但是为什么在使用C ++时它没有集成到IDE中?这是否是因为必须解析C ++的方式?

10 个答案:

答案 0 :(得分:70)

C ++的语法和语义使非常困难正确实现重构功能。有可能实现一些相对简单的东西来覆盖90%的情况,但在剩下的10%的情况下,简单的解决方案会通过改变你永远不想改变的东西来破坏你的代码。

阅读http://yosefk.com/c++fqa/defective.html#defect-8,以简要讨论C ++中任何重构代码必须处理的困难。

微软显然决定在C ++的这一特定功能上投入使用,让第三方开发人员尽其所能。

答案 1 :(得分:11)

我不确定为什么会这样,但有第三方工具可以提供帮助。例如,现在我正在评估Visual Assist X(通过Whole Tomato)。我们也使用Visual Studio 2005。

答案 2 :(得分:5)

devexpress为VS2005和VS2008提供了加载项Refactor! for C++

答案 3 :(得分:4)

不要感到难以理解,它在VB.Net中也不可用:)

与C#相比,C ++是一种解析的HARD语言(VB也是如此,除非你“Option Explicit”和“Option Strict”开启,否则很难准确地说出任何代码行在多个更大的上下文中的作用)。

猜测它可能与提供它的“难度”有关。

P.S。我将我的答案标记为社区维基,因为我知道它没有提供任何有用的信息。

答案 4 :(得分:4)

Eclipse几乎没有c ++重构,包括'rename'。在StackOverflow上查看此question

也可以在Eclipse中使用Microsoft编译器。查看here

尝试Eclipse并查看它是否适合您。

答案 5 :(得分:3)

围绕这个问题存在很多争议和混乱。这个惊人的YouTube视频应该清楚为什么C ++重构很难:https://www.youtube.com/watch?v=mVbDzTM21BQ

谷歌通过使用允许访问其中间格式的编译器(Clang + LLVM)重构他们的整个1亿行C ++代码库。

底线,第三方被搞砸了,除非MS以相同的方式输出中间结果,否则他们没有现实的方法来重构VS C ++。如果从编程问题的角度来看,这是显而易见的:为了重构VS C ++,你必须能够以与VS相同的方式编译C ++,具有相同的错误,限制,缺陷,黑客,快捷方式,变通方法等。像Coderush和Resharper这样的常见嫌疑人没有那种疯狂的预算,虽然显然他们正在尝试,但已经有好几年......

http://www.jetbrains.com/resharper-cpp/

2016年更新:Resharper现在在C ++重构方面做得不错。限制纯粹适用于大型/巨型项目。

答案 6 :(得分:1)

我一直在视觉工作室使用Visual Assist X大约一年半。它是一个令人难以置信的工具,可以帮助您使用普通的C ++代码,但它在模板化代码上表现不佳。例如,如果你有一个复杂的基于策略的模板设计,它将不知道如何重命名你的变量,并且项目将不再编译。

答案 7 :(得分:0)

答案 8 :(得分:0)

我想指出Qt Creator(一个与VC ++库和构建系统兼容的C ++ IDE)提供了非常有效的符号重命名:

  

您可以重命名项目中所有文件中的符号。重命名类时,还可以更改与类名匹配的文件名。

Qt Creator - Refactoring: Renaming Symbols

Qt Creator的重命名功能为您提供了它找到的符号引用列表,以及在执行替换之前排除任何符号引用的机会。因此,如果它导致符号引用错误,您可以将其排除。

Qt Creator Refactor Replace

因此可以重命名C ++符号。从Qt Creator来到VS我感受到了你的痛苦,直到我考虑将相当大规模的现有VS项目转换为使用Qt Creator。

我并不认为这在C ++中特别难。除了它在Qt Creator中已经运行良好的事实之外,编译器和链接器可以找到并匹配符号这一事实:如果这不可能你就无法构建你的应用程序

事实上,动态类型的Python等语言也有重命名工具。如果您可以为没有显式引用变量类型的语言创建这样的工具,那么您肯定可以为C ++创建它。

案例:

  

... Rope,一个python重构库...我尝试了几次重命名,这绝对有效。

Stack Overflow - What refactoring tools do you use for Python?

答案 9 :(得分:-3)

尽管所有专家都发表了评论,但我完全不同意重构支持问题与C ++语言语义或任何语言语义有关。除了编译器构建器本身之外,由于它们自己的原因或限制,它们不会选择在第一种情况下实现它们。

并且不采取进攻但我很遗憾地说jsb先生您提供的上述链接是为了支持您关于C ++缺陷的案件(即yosefk),这完全是不可能的。当有人要求“圣弗朗西斯科”时,它更像是为“洛杉矶”提供方向。

在我看来,针对某种语言提出重构难度问题更像是在语言完整性本身上提出一种指责。特别是对于有时只是痛苦的语言....当涉及到它们的变量声明和使用时。 :) 好的!告诉我你怎么在节点树中忽略一些节点...呃?那么它与任何语言的关系就像机器级代码一样简单。您知道VS编译器可以轻松检测某些变量或例程是否为死代码。明白我的观点?

关于开发第三方工具。我认为编译器供应商可以更容易和有效地实现它,如果他们想要第三方工具,必须复制所有解析数据库来处理它。现在,编译器可以在机器代码级别非常有效地优化代码,我在这里听到很难说出以前如何使用某个变量。你还没有真正关注编译器的内部工作。它保留在哪个数据库中。

确定它与IDE用于所有类似目的的几乎相同的数据库。在之前的时间里,编译器只是一个单独的实体,而IDE只是一个具有一些特殊性的文本编辑器,但随着时间的推移,编译器和IDE编辑器之间的差距变小了,它直接开始在类似的解析数据库上工作。这使得有可能更有效地处理所有那些智能感知和重构或其他语法相关问题。有了所有预编译的东西和JIT编译,这个差距几乎是疏忽的。因此,为了这两个目的使用相同的数据库几乎是有意义的,否则由于重复,您的内存需求会更高。

你们都是程序员 - 我不是!你们似乎很难想象如何为C ++或任何我无法理解的语言实现重构。它只是为了你需要付出更多的努力,取决于你试图推动的人的重量。

无论如何,VS一个不错的IDE,特别是在C#时。