【问题标题】:Why is Visual C++ lacking refactor functionality?为什么 Visual C++ 缺少重构功能?
【发布时间】:2010-09-26 16:06:37
【问题描述】:

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

我经常使用重命名,当它不存在时你真的很想念它。我相信您可以获得提供此功能的插件,但为什么在使用 C++ 时不将其集成到 IDE 中?这是因为必须解析 C++ 的方式存在一些问题吗?

【问题讨论】:

  • 重构对于 C++ 来说很困难,但我觉得 VS 应该添加一种 Rename all 类似 Xcode C++ 中的功能。

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


【解决方案1】:

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

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

微软显然决定为 C++ 开发这一特殊功能,让第三方开发人员尽其所能。

【讨论】:

  • 不,确实是非常糟糕的链接。这个人很沮丧,甚至没有礼貌(联系过那个人一次,关于一些明显的辱骂点,他不在乎)。但是,是的,重构显然很困难(取决于代码大小),并且在初始设计时必须三思而后行。
  • 所以我们在这里说微软在解决难以置信的困难任务方面表现不佳,而 Eclipse 基金会更好?我在 VS 中针对项目约束进行编程,但是当我需要重命名变量时,我会为此启动 Eclipse...
  • 为什么这是一个公认的答案?将 C++ 代码解析为语义上有意义的形式必须由编译器完成。 MS 显然拥有其 IDE 中包含的编译器。为什么不使用相同的解析代码?解析有多难真的无关紧要,因为无论如何他们已经做到了。
  • 这是一个糟糕的链接,因为作者缺乏 C++ 知识。例如,他不知道 RVO。如果您打算使用 Clang API,重构工具非常简单,因为作者已经经历了所有重载决议的地狱。问题是 MSVS 缺少这样的 API。
  • Microsoft Visual Studio 2015 能够重构重命名部分 C++ 代码。
【解决方案2】:

我不知道为什么会这样,但是有第三方工具可以提供帮助。例如,现在我正在评估Visual Assist X(全番茄)。我们也在使用 Visual Studio 2005。

【讨论】:

  • Visual Assist X 非常好,通常可以很好地完成这项工作。但是,如果您将所有模板元程序都放在上面,它可能会对您的一些代码提出异议。
  • 确实如此。我注意到它不能很好地处理多于几层的模板(比如在使用 Boost 时)。
【解决方案3】:

devexpress 为 VS2005 和 VS2008 提供插件 Refactor! for C++

【讨论】:

  • 但是它不再支持VS2005了。
【解决方案4】:

别觉得难做,VB.Net 也没有 :)

与 C# 相比,C++ 是一种难以解析的语言(VB 也是如此,除非您打开了“Option Explicit”和“Option Strict”,否则很难从更大的上下文中准确判断任何代码行在做什么) )。

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

附:我将我的答案标记为社区 wiki,因为我知道它没有提供任何有用的信息。

【讨论】:

    【解决方案5】:

    Eclipse 很少进行 C++ 重构,包括“重命名”。在 StackOverflow 上查看此 question

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

    试试 Eclipse,看看它是否适合你。

    【讨论】:

      【解决方案6】:

      围绕这个问题有很多困惑和困惑。这段精彩的 youtube 视频应该可以解释为什么 C++ 重构很难:https://www.youtube.com/watch?v=mVbDzTM21BQ

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

      归根结底,第三方在这里被搞砸了,除非 MS 以相同的方式输出中间结果,否则他们没有现实的方法来重构 VS C++。如果您从编程问题的角度考虑,这很明显:为了重构 VS C++,您必须能够以与 VS 完全相同的方式编译 C++,但具有相同的错误、限制、缺陷、黑客、快捷方式、解决方法等. 像 Coderush 和 Resharper 这样的常见嫌疑人没有预算来应对这种精神错乱,尽管他们显然正在尝试,但已经有好几年了......

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

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

      【讨论】:

        【解决方案7】:

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

        他们大约 10 年前就开始这样做了,我记得很久以前看过 ms channel9。

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            【解决方案9】:

            【讨论】:

            • 问题与 VS 2008 有关。此插件有效> VS 2013
            【解决方案10】:

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

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

            Qt Creator - Refactoring: Renaming Symbols

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

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

            我不相信这在 C++ 中特别难的论点。除了它已经在 Qt Creator 中运行良好之外,还有一个事实是编译器和链接器可以查找和匹配符号:如果这不可能,您就无法构建您的应用程序。

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

            例子:

            ...绳子,一个python重构库...我尝试了几次重命名,结果确实按预期工作。

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

            【讨论】:

              【解决方案11】:

              尽管你们所有的专家都提出了 cmets,但我完全不同意重构支持问题与 C++ 语言语义或任何语言语义有关。除了编译器构建者自己不会因为他们自己的原因或限制而选择在第一种情况下实现一个。

              不要冒犯,但我很遗憾地说 jsb 先生,您提供的上述链接以支持您关于 C++ 缺陷的案例(即 yosefk)完全没有问题。当有人要求“旧金山”时,它更像是您为“洛杉矶”提供方向。

              在我看来,提出某些语言的重构难度问题更像是对语言完整性本身提出质疑。特别是对于有时只是痛苦的语言......当涉及到它们的变量声明和使用时。 :) 好的!告诉我你怎么会失去对节点树中某个节点的跟踪......嗯?所以它对任何语言都有什么作用,就像机器级代码一样简单。您知道您的 VS 编译器可以轻松检测某些变量或例程是否是死代码。明白我的意思了吗?

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

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

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

              无论如何,与一个不错的 IDE 相比,尤其是在 C# 方面。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-07-21
                • 1970-01-01
                • 1970-01-01
                • 2011-07-05
                • 2011-03-11
                • 2019-01-17
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多