为什么C++编译器有错误的错误消息

J-W*_*Win -3 c++ compiler-errors

为什么C++编译器(以及一般其他编程语言的编译器)具有相当模糊的错误消息?它可能是基于历史的吗?懒惰?或者为每个人制作明确的错误消息是否太难了?

从模板错误产生的错误消息可能相当烦人/令人生畏.此外,错误消息可以使用非直观的缩写,例如"静态成员函数不能具有cv限定符."我认为"cv"代表常量/不稳定.

Lig*_*ica 10

首先,不是C++会给你错误信息; 这是你的编译器.这可能听起来很学术,但这是一个重要的区别.并不是它确实会影响您的问题,因为编译器诊断在所有主流实现中都相当复杂.

这不是因为懒惰而且不是历史; 它是这些因素的组合:

  • 渴望精确

    对于一些新手而言,这意味着真正的专业人士无法获得他们可以使用的信息,这对他们来说并不好.在您的示例中,"cv-qualifier"是准确而精确的,并告诉您发生了什么.你可以找到一些其他方式来描述它,但这实际上并没有映射到你正在使用的语言正在发生的事情,或者它会是错误的.

  • 实施复杂性

    好吧,公平地说,模板诊断可能是可怕的.在最近的GCC版本中,Clang和STLFilt等工具一直在努力改进这一点.但是,最终,这很难做到.这真的很难.如果您认为可以做得更好,请随意为您喜欢的实施提交补丁.:)

  • 语言复杂性

    C++非常复杂.这就是它的本质.它功能强大,远远超过一点脚本语言或任何语言为您提供更漂亮的信息.有人可能会说它的构造过于复杂,这是对语言的一种常见批评.可以说的是,需要复杂,精确的诊断从至少部分茎.

  • 无法进行心灵阅读

    这是第一个因素的变化.为了生成一组更简单的错误消息,编译器必须知道,当代码被破坏时,您打算写什么.没有心灵阅读就不可能做到这一点.编译器可以尝试猜测,但风险在于它会猜错.事实上,在像C++这样复杂的语言中,这种风险非常高.所以我们更喜欢编译器与我们直接相关,然后我们根据我们编写的代码训练我们的大脑进行模式匹配诊断; 一个专业的C++开发人员通常可以在几秒钟内识别出特定错误消息的原因(由特定的代码片段触发)......即使该错误消息恰好是那种表面上的错误消息完全无益的.这是我们交易的魔力!