为什么C ++编译器(以及一般其他编程语言的编译器)有相当模糊的错误消息?它可能是基于历史的吗?懒惰?或者是否很难为每个人制作明确的错误信息?
模板错误产生的错误消息可能相当烦人/令人生畏。此外,错误消息可以使用非直观的缩写,例如“静态成员函数不能具有cv限定符。”我相信“cv”代表常量/不稳定。
答案 0 :(得分:10)
首先,不是C ++会给你错误信息;这是你的编译器。这可能听起来很学术,但这是一个重要的区别。并不是说它确实会影响你的问题,因为编译器诊断在所有主流实现中相当复杂。
这不是因为懒惰而且不是历史性的;这是这些因素的组合:
渴望精确
对于一些新手而言,这意味着真正的专业人士无法获得他们可以使用的信息。在您的示例中,“cv-qualifier”是准确而精确的,并告诉您发生了什么。你可以找到一些其他方式来描述它,但这实际上并没有映射到你正在使用的语言正在发生的事情,或者它会是错误的。
实施复杂性
好的,公平地说,模板诊断可能可怕。在最近的GCC版本中,Clang和STLFilt等工具一直在努力改进这一点。但是,最终,这很难做到。这真的很难。如果您认为可以做得更好,请随意为您喜欢的实施提交补丁。 :)
语言复杂性
C ++非常复杂。这就是它的本质。它非常强大,远远超过一点脚本语言或任何语言给你更漂亮的信息。有人可能会说它的构造太复杂了,这是对语言的一种常见批评。可以说需要进行复杂,精确的诊断至少部分源于此。
无法进行思维阅读
这是第一因素的变体。为了生成一组更简单的错误消息,编译器必须知道,当代码被破坏时,您打算写什么。没有心灵阅读就不可能做到这一点。编译器可以尝试猜测,但风险在于它会猜错。事实上,在像C ++这样复杂的语言中,这种风险非常高。所以我们更喜欢编译器与我们直接相关,然后我们根据我们编写的代码训练我们的大脑进行模式匹配诊断;一个专业的C ++开发人员通常可以在几秒钟内识别出特定错误消息的原因(由特定的代码片段触发)......即使该错误消息恰好是那种表面上的错误消息完全无益的。这是我们交易的神奇之处!