虽然C ++标准委员会努力定义其复杂但强大的功能并保持其与C的向后兼容性,但根据我的个人经验,我发现由于缺少工具,C ++编程的许多方面都很麻烦。
例如,我最近尝试重构一些C ++代码,用T&更换了许多shared_ptr。删除大型库中不需要的指针用法。我必须手动执行几乎整个重构,因为没有任何重构工具可以帮助我安全地执行此操作。
使用调试器处理STL数据结构就像是在不同意时掏出陌生人的电话号码。
根据您的经验,C ++中缺少哪些重要的开发人员工具?
答案 0 :(得分:26)
我的梦工具是编译时模板调试器。有些东西可以让我以交互方式逐步完成模板实例化,并在实例化时检查类型,就像常规调试器在运行时一样。
答案 1 :(得分:11)
根据您的经验,C ++中缺少哪些重要的开发人员工具?
代码完成。认真。重构是一个很好的功能,但我认为代码完成对API的可发现性和可用性更为重要和更重要。
基本上,需要任何未完成的C ++代码的工具很糟糕。
答案 2 :(得分:8)
类方法的代码生成。当我输入声明时,您应该能够找出定义。虽然我正在谈论这个主题,但我们可以修改“goto declaration / goto definition”总是要声明吗?
重构。是的,我知道这是正式的,因为预处理器是不可能的 - 但编译器仍然可以更好地进行搜索并替换变量名,而不是我可以。您也可以在语法时突出显示本地,成员和参数。
棉绒。那么我刚刚定义的变量会影响更高的变量? C会告诉我,在1979年,但2009年的c ++显然更喜欢我自己找出来。
一些体面的错误消息。如果我保证永远不会在类的方法中定义一个具有相同名称的类 - 你是否答应告诉我一个缺失的“}”。实际上,编译器可以具有一些历史知识 - 所以如果我添加了一个不平衡的“{”或“(”到一个以前工作的文件,我们可以考虑在消息中提到这个吗?
请问STL错误消息(抱歉引用另一条评论)看起来不像你读“/ dev / random”,在前面卡住“!/ bin / perl”然后在结果中运行税码?
对有用的东西有些警告怎么样? “用作bool性能警告的整数”没有用,它没有任何性能差异,我没有选择 - 这是库的功能,你已经告诉了我50次。 但如果我错过了“;”从类声明的结尾或方法定义的末尾的“}”你不要警告我 - 你会尽量找到解析结果的最不可能(但理论上)正确的方法。 /> 这就像在这个浏览器中内置的拼写检查器,很高兴地接受我拼写错误(因为拼写是一个阉割的雄性山羊的古老术语!我写了多少次关于女高音草食动物?)
拼写检查怎么样? 40年前大型机Fortran编译器进行了拼写检查,所以如果拼写错误的“WRITE”,你第二天就不会再回到一堆卡片和一个鼻涕的错误信息。您收到一条警告,“WRIET”已在第X行更改为WRITE。现在编译器很高兴继续并花费10分钟构建一些大量的浏览文件和调试器输出,然后再告诉您拼错了10,000行以前的版本。
PS。是的,其中很多只适用于Visual C ++。
PPS。是的,他们现在正在服用我的药物。
答案 3 :(得分:6)
C ++的主要问题是难以解析。这就是为什么那里有很少的工具可以处理源代码。 (这也是为什么我们在编译器的历史中遇到了一些最可怕的错误消息。)结果是,除了极少数例外(我只知道doxygen和Visual Assist),它取决于实际的编译器支持协助我们编写和按摩代码所需的一切。由于编译器传统上是相当简化的命令行工具,因此构建丰富的编辑器支持是一个非常薄弱的基础。
现在大约十年了,我和VS一起工作。同时,它的代码完成几乎可用。 (是的,我正在研究双核机器。我不会这样说,不是吗?)如果使用Visual Assist,代码完成实际上非常好。 VS本身和VA现在都有一些基本的重构。这也几乎可以用于它所针对的少数事情(即使它仍然明显少于代码完成)。当然,用搜索和&amp ;;重构15年。取而代之的是盒子里唯一的工具,与其他语言相比,我的要求可能太差了,所以这可能并不多。
然而,我真正缺乏的仍然是:在我的代码移植到的所有平台上完全符合标准的编译器和标准库实现。我说这是>发布后10年最后一个标准和下一个标准发布前一年! (这只是添加了这个: C ++ 1x被2011年广泛采用。)
一旦这些问题得到解决,就会有一些事情不断被提及,但是哪些供应商仍然在遵守> 10年的标准(或者,实际情况是某些功能,甚至是放弃它,从来没有实际解决过:
operator<<()
给我们带来的所有编译时优势,它通过调用运行时解析printf()
来引导我们(DietmarKühl一次)开始这样做,不幸的是他的实施在没有技术变得普及的情况下就死了)lint
这样的工具变得无用(不需要担心,lint
供应商,这只是一厢情愿的想法)如果所有这些以及我忘记提及的许多其他内容(随意添加)都得到解决,那么获得几乎与Java或C#相同的重组支持将会很不错。但只有这样。
答案 4 :(得分:6)
如果谈论MS Visual Studio C ++,Visual Assist是一个非常方便的代码完成工具,一些重构 - 例如重命名所有/选定的引用,查找/转到声明,但我仍然想念JBuilder或IntelliJ等Java IDE的丰富内容。
我仍然想念的是一个语义差异工具 - 你知道,它不是逐行比较两个文件,而是语句/表达式。我在互联网上发现的只是一些被遗弃的尝试 - 如果你知道一个,请写评论
答案 5 :(得分:5)
尝试优化编译模型的编译器。
不是天真地根据需要包含头文件,而是在每个编译单元中再次解析它们,为什么不首先解析头文件,为它们构建完整的语法树(必须包含预处理器指令,因为我们还不知道哪个宏被定义),然后只要包含头文件就运行该语法树,应用已知的#defines来修剪它。
它甚至可以用作预编译头文件的替代品,因此每个头文件都可以单独预编译,只需将此语法树转储到磁盘即可。我们不需要一个单一且容易出错的预编译头,并且在重建时可以获得更精细的粒度,即使修改了头文件,也可以尽可能少地重建。
像我的其他建议一样,这需要做很多工作,但我看不出任何基本问题,使其不可能。
似乎它可以大大加快编译时间,几乎使它在头文件的数量上呈线性,而不是#includes的数量。
答案 6 :(得分:4)
快速可靠的索引器。大多数花哨的功能都在此之后。
答案 7 :(得分:4)
执行编码标准的常用工具 采用所有通用标准,允许您根据项目的需要打开/关闭它们。
目前只有一大堆perl scrips usullay必须提供支持。
答案 8 :(得分:3)
我对C ++工具的状态非常满意。我唯一能想到的是在VS / gcc中默认安装Boost。
答案 9 :(得分:3)
重构,重构,重构。并在打字时编译。对于重构,我至少缺少大多数现代Java IDE可以做的一半。虽然Visual Assist X有很长的路要走,但很多重构都缺失了。编写C ++代码的任务仍然很多。编写C ++代码。 IDE支持高级重构越多,它构成的越多,结构越容易出错,越容易迭代结构并改进它。拿起Intellij和see what you are missing的演示版。这些只是几年前我记得的一些。
Extract接口:使用公共接口获取视图类,将公共函数移动到接口类中(对于C ++,这将是一个抽象基类)并将指定的函数派生为抽象
更好的提取方法:标记一段代码并让ide编写一个执行该代码的函数,构造正确的参数并返回值
了解您正在使用的每个符号的类型,这样不仅命令完成对于派生值也是正确的,例如symbol-&gt; ...但也只提供返回当前表达式中可以使用的类型的函数,例如为了
UiButton button = window-&gt; ...
仅...插入实际返回UiButton的函数。
答案 10 :(得分:2)
一个独立的工具:命名约定。
答案 11 :(得分:2)
智能智能感知/代码完成,即使是模板密码。
当你进入一个函数模板时,编译器当然不能说肯定关于模板参数(至少没有概念),但它应该能够做到很多猜测和估计。根据函数中类型的使用方式,它应该能够缩小可能的类型,实际上是一种保守的ad-hoc概念。如果函数中的一行在模板类型上调用.Foo(),显然必须存在Foo成员方法,Intellisense也应该在函数的其余部分中建议它。
它甚至可以查看调用函数的位置,并使用它来确定至少一个有效的模板参数类型,并根据该函数在函数内部提供Intellisense。
如果使用int
作为模板参数调用该函数,那么显然,int
的使用必须有效,因此IDE可以将其用作函数内的“样本类型”并基于此提供智能感知建议。
JavaScript刚刚在VS中获得了Intellisense支持,它必须克服许多类似的问题,所以可以做到。当然,有了C ++的复杂程度,这将是一项荒谬的工作量。但这是一个很好的功能。