首页 文章

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

提问于
浏览
77

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

我经常使用 Rename 你真的很想念它's not there. I'我确定你可以得到提供这个的插件,但为什么在使用C时它没有集成到IDE中?这是因为必须解析C的方式有些问题吗?

11 回答

  • 1

    不要觉得很难,它在VB.Net中也不可用:)

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

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

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

  • 4

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

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

    微软显然已决定为C的这一特定功能提供支持,让第三方开发人员尽其所能 .

  • 4

    我'm not sure why it is like this, but third-party tools exist that help. For example, right now I'正在评估Visual Assist X(由Whole Tomato提供) . 我们也使用Visual Studio 2005 .

  • 0

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

  • 11

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

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

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

  • -3

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

    tl;博士通过使用允许访问其中间格式的编译器(Clang LLVM)重构其整个1亿行C代码库 .

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

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

    2016年更新:Resharper现在在C refactor上做得不错 . 限制纯粹适用于大型/巨型项目 .

  • 5

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

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

  • 2

    我和视觉工作室一直在使用Visual Assist X大约一年半 . 它在模板化代码上表现得非常好 . 例如,如果你有一个复杂的基于策略的模板设计,它就会再次被编译 .

  • 70
  • 3

    我想指出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?

  • 0

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

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

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

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

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

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

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

相关问题