为什么Visual C ++缺乏重构function?

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

我不断地使用Rename ,当它不在时你真的很想念它。 我相信你可以得到这样的插件,但是为什么在使用C ++的时候没有把它集成到IDE中呢? 这是由于在C ++必须parsing的方式的一些问题?

C ++的语法和语义使得难以正确地实现重构function。 可以实现一些相对简单的事情来覆盖90%的案例,但是在剩余的10%的案例中,简单的解决scheme将通过改变你从来不想改变的东西来破坏你的代码。

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

微软显然决定放弃这个特殊的C ++特性,让第三方开发者尽其所能。

我不确定这是为什么,但有第三方工具帮助。 例如,现在我正在评估视觉辅助X (由全蕃茄)。 我们也使用Visual Studio 2005。

devexpress提供了Add-in Refactor! 用于 VS2005和VS2008的C ++ 。

不要觉得很难做,它不是在VB.Net中:)

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

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

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

Eclipse几乎没有包含“重命名”的c ++重构。 看看这个问题在这里StackOverflow。

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

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

围绕这个问题有很多的困惑和困惑。 这个惊人的YouTubevideo应该清除为什么C ++重构是困难的: https : //www.youtube.com/watch?v=mVbDzTM21BQ

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

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

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

大约十年前他们已经开始这样做了,我记得很久以前看过ms频道了。

我一直在Visual Studio使用Visual Studio一年半左右。 这是一个令人难以置信的工具,可以帮助你很多普通的C ++代码,但是在模板化代码上performance不佳。 例如,如果你有一个复杂的基于策略的模板devise,它将不知道如何重命名你的variables,项目将不会再编译。

安装插件,使您的function: https : //visualstudiogallery.msdn.microsoft.com/164904b2-3b47-417f-9b6b-fdd35757d194

那么尽pipe所有你的专家的意见,我完全不同意重构支持问题有关C语言语义或任何语言语义的事情。 除了编译器生成器本身,由于他们自己的原因或约束条件,他们本身不会select第一种情况。

不要采取冒犯,但我很抱歉地说,先生你提供的上述链接,以支持你的情况(即约瑟夫)关于C ++缺陷是完全没有问题的。 当有人要求“San Franisco”的时候,它更像是给“洛杉矶”提供方向。

在我看来,提高某些语言的重构难度更像是提高语言完整性本身。 特别是对于有时只是痛苦的语言….当涉及到他们的variables声明和使用。 :) 好的! 告诉我你是如何松散地跟踪节点树内的某个节点的……呃? 那么,对于任何语言来说,它和机器级代码一样简单。 你知道你的VS编译器可以很容易地检测出一些variables或例程是否是死代码。 明白了吗?

关于开发第三方工具。 我认为,如果编译器供应商想要使用第三方工具来复制所有parsing数据库来处理这个工具,那么编译器供应商可以更容易,更高效地实现它。 现在,编译器可以在机器代码级非常高效地优化代码,我在这里听到很难说如何使用一些variables。 我并没有真正注意编译器的内部工作。 它保存在哪个数据库中。

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

你们都是程序员 – 我不是! 而你们似乎很难想象如何重构C ++或者我无法理解的任何语言。 它只是为了一些你不得不付出更多的努力取决于你试图推动一个人有多沉重。

反正方式VS一个很好的IDE,尤其是当涉及到C#。