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

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

我经常使用 重命名,当它不在的时候你真的很想念它。我相信你可以得到提供这个功能的插件,但是为什么在使用 C + + 的时候它没有集成到 IDE 中呢?这是否是由于 C + + 必须解析的方式中的某些陷阱?

42630 次浏览

我不知道为什么会这样,但是存在第三方工具可以提供帮助。例如,现在我正在评估 视觉辅助 X(通过整个番茄)。我们还使用 VisualStudio2005。

不要觉得很辛苦,在 VB.Net 中也没有:)

与 C # 相比,C + + 是一种很难解析的语言(VB 也是如此,除非你已经打开了“选项显式”和“选项严格”功能,否则很难在一个更大的上下文中准确地分辨出任何一行代码在做什么)。

我猜这可能与提供这种服务的“困难”有关。

另外,我把我的答案标记为社区维基,因为我知道它没有提供任何有用的信息。

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

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

微软显然已经决定把 C + + 的这个特殊功能作为赌注,让第三方开发人员来做他们能做的事情。

DevExpress 为 VS2005和 VS2008提供插件 为 C + + 重构

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

尽管你们所有的专家都发表了意见,但我完全不同意重构支持问题与 C + + 语言语义或任何语言语义有关的观点。除了编译器构建器本身没有选择实现一个在第一种情况下,由于他们自己的原因或约束他们可能。

我不想冒犯你,但是我很抱歉地说 jsb 先生,你提供的上面的链接支持你的案例(比如 Yosefk)关于 C + + 缺陷是完全没有问题的。这更像是当有人问“旧金山”时,你为“洛杉矶”提供方向。

在我看来,对某些语言提出重构难度问题更像是对语言完整性本身提出质疑。特别是对于那些有时只是痛苦的语言来说。当涉及到它们的变量声明和使用时。好吧!告诉我,你怎么会在一棵节点树里找不到一个节点呢?所以它对任何语言的作用就像机器级代码一样简单。你知道你 VS 编译器可以很容易地检测一些变量或例程是死代码。明白我的意思了吗?

关于开发第三方工具。我认为编译器供应商可以更容易和有效地实现它,如果他们曾经希望然后第三方工具,将不得不复制所有的解析数据库来处理它。现在编译器可以非常有效地在机器代码级优化代码,我在这里听到的是,它很难告诉一些变量是如何使用以前。我想你还没有真正注意过编译器的内部工作。它保存在哪个数据库里。

而且确保它与 IDE 用于所有类似目的的数据库几乎相同。以前,编译器只是一个单独的实体,IDE 只是一个带有一些专门化的文本编辑器,但随着时间的推移,编译器和 IDE 编辑器之间的差距变得越来越小,它直接开始在类似的解析数据库上工作。这使得更有效地处理所有这些智能感知和重构或其他语法相关问题成为可能。对于所有的预编译工作和 JIT 编译来说,这个差距几乎是忽略不计的。因此,使用同一个数据库实现这两个目的几乎是有意义的,否则由于复制,内存需求会更高。

你们都是程序员-我不是!你们似乎很难想象重构是如何在 C + + 或任何我不能理解的语言中实现的。这只是为了一些事情,你必须付出更多的努力,少一些取决于多重的人,你试图推。

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

Eclipse 很少进行包括“ rename”在内的 c + + 重构。

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

尝试 Eclipse,看看它是否适合您。

在这个问题上存在着许多争议和混乱。这个令人惊叹的 youtube 视频应该可以解释为什么 C + + 重构很难: https://www.youtube.com/watch?v=mVbDzTM21BQ

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

底线是,第三方在这里搞砸了,没有现实的方法让他们重构 VS C + + ,除非 MS 以同样的方式输出中间结果。如果你从编程问题的角度来看,这是显而易见的: 为了重构 VS C + + ,你必须能够用 VS 编译 C + + 的完全相同的方式来处理相同的 bug、限制、缺陷、黑客攻击、快捷方式、变通方法等等。通常的嫌疑人像科德鲁什和 Resharper 没有预算为这种疯狂虽然显然他们正在努力,但它已经多年..。

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

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

MS 最终做到了这一点: https://channel9.msdn.com/Shows/C9-GoingNative/GoingNative-33-C-Refactoring-in-Visual-Studio-2015#time=04m37s

他们大约10年前就开始这么做了,我记得很久以前看过 MS 频道。

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

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

重构: 重命名符号

Qt Creator 的重命名功能为您提供了它发现的符号引用的列表,并提供了在执行替换之前排除任何引用的机会。因此,如果它得到一个符号引用错误,您可以排除它。

Qt Creator Refactor Replace

所以 C + + 符号重命名是可能的。从 Qt Creator 到 VS,我感受到了您的痛苦,以至于我已经考虑将原有的大型 VS 项目转换为使用 Qt Creator。

我不认为这在 C + + 中是特别困难的。除了它已经在 Qt Creator 中工作得很好之外,还有一个事实是编译器和链接器可以找到并匹配符号: 如果这不可能,你就不能构建你的应用程序。

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

举个例子:

... Rope,一个 Python 重构库... 我尝试了几次重命名,结果确实如我所料。

Stack Overflow-Python 使用哪些重构工具?