在Visual Studio 2008中使用C ++进行编程时,为什么没有使用C#时在重构菜单中看到的功能?
我经常使用“重命名”,当它不存在时,您真的会错过它。我确定您可以获得提供此功能的插件,但是为什么在使用C ++时却不将其集成到IDE中呢?这是由于必须解析C ++的方式引起的麻烦吗?
Answers:
C ++的语法和语义使正确实现重构功能变得异常困难。可以实现相对简单的方法来覆盖90%的情况,但是在其余10%的情况下,简单的解决方案将通过更改您不想更改的内容来严重破坏您的代码。
阅读http://yosefk.com/c++fqa/defective.html#defect-8,简要讨论C ++中任何重构代码都必须解决的困难。
微软显然已经决定对C ++的这一特定功能进行改进,由第三方开发人员自行决定。
我不确定为什么会这样,但是存在第三方工具可以提供帮助。例如,现在我正在评估Visual Assist X(Whole Tomato)。我们还使用Visual Studio 2005。
关于这个问题有很多困惑和困惑。这段令人赞叹的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 ++重构方面做得不错。局限性仅适用于大型/大型项目。
MS终于做到了:https : //channel9.msdn.com/Shows/C9-GoingNative/GoingNative-33-C-Refactoring-in-Visual-Studio-2015#time=04m37s
他们大约10年前就开始这样做,我记得很久以前就看过ms channel9。
我已经在Visual Studio中使用Visual Assist X大约一年半了。这是一个令人难以置信的工具,它对普通C ++代码有很大帮助,但是在模板代码上却表现不佳。例如,如果您有一个复杂的基于策略的模板设计,它将不知道如何重命名变量,并且该项目将不再编译。
我想指出,Qt Creator(与VC ++库和构建系统兼容的C ++ IDE)提供了很好的符号重命名:
您可以在项目中的所有文件中重命名符号。重命名类时,还可以更改与类名称匹配的文件名。
Qt Creator的重命名功能为您提供了找到的符号引用的列表,并有机会在执行替换之前排除其中的任何符号。因此,如果符号引用错误,则可以将其排除。
因此,C ++符号重命名是可能的。从Qt Creator进入VS时,我感到很痛苦,以至于我考虑过将相当大的VS项目转换为使用Qt Creator。
我不认为这在C ++中特别难。除了它在Qt Creator中已经可以很好地工作之外,编译器和链接器还可以找到并匹配符号,这是事实:如果不可能,则无法构建应用程序。
实际上,诸如Python之类的动态类型的语言也具有重命名工具。如果您可以为没有明确引用变量类型的语言创建这样的工具,那么绝对可以为C ++实现。
例子:
... Rope,一个python重构库...我尝试过几次重命名,这确实按预期工作。
尽管有各位专家的意见,但我完全不同意重构支持问题与C ++语言语义或与此相关的任何语言语义有关。除了编译器构建器本身,由于其自身的原因或约束,他们不会选择在第一种情况下实现。
当然,不要冒犯,但很抱歉,jsb先生提供的上述链接来支持有关C ++缺陷的案例(例如yosefk),这是毫无疑问的。它更像是您在有人要求“ San Franisco”时向“ Los angeles”提供指导。
在我看来,某些语言的重构难度问题更像是对语言完整性本身的指责。特别是对于有时只是痛苦的语言。。。涉及到变量的声明和使用。:) 好的!告诉我您如何松开节点树中某个节点的轨迹……是吗?因此,只要像机器级别的代码一样简单,它对任何语言都可以做什么。您知道VS编译器可以轻松检测某些变量或例程是否为无效代码。有我的意思吗?
关于开发第三方工具。我认为,如果编译器供应商想要使用第三方工具,而后者必须复制所有解析数据库来处理它,那么它们可以更加轻松,有效地实现它。如今,编译器可以在机器代码级别非常有效地优化代码,我在这里听说很难分辨以前如何使用某些变量。我想您没有真正关注编译器的内部工作。它保留在哪个数据库中。
并确保将IDE用于几乎所有类似目的的数据库几乎相同。以前,编译器只是一个单独的实体,而IDE只是具有某些专门知识的文本编辑器,但是随着时间的流逝,编译器和IDE编辑器之间的差距越来越小,它可以直接在类似的已解析数据库上工作。这使得可以更有效地处理所有这些智能感知和重构或其他与语法相关的问题。使用所有预编译的东西和JIT进行编译,这种差距几乎是疏忽的。因此,将两个数据库同时用于这两个目的几乎是有意义的,否则由于重复,您的内存需求会更高。
你们都是程序员-我不是!你们似乎很难想象如何对C ++或我不理解的任何语言实现重构。这仅仅是为了您要做的事情,这取决于您尝试推动的人有多沉重。
无论如何,VS一个不错的IDE尤其是在涉及C#时。
Rename all
一种功能,例如Xcode C ++中的功能。