为什么C++编译器(以及其他编程语言的编译器)的错误信息相当晦涩?这是历史原因吗?还是懒惰?或者对于所有人来说制作清晰的错误信息太难了?
模板错误产生的错误信息可能会非常恼人/令人生畏。此外,错误消息可能使用非直观的缩写,例如“静态成员函数不能有cv限定符。”我认为“cv”代表常量/易失性。
为什么C++编译器(以及其他编程语言的编译器)的错误信息相当晦涩?这是历史原因吗?还是懒惰?或者对于所有人来说制作清晰的错误信息太难了?
模板错误产生的错误信息可能会非常恼人/令人生畏。此外,错误消息可能使用非直观的缩写,例如“静态成员函数不能有cv限定符。”我认为“cv”代表常量/易失性。
首先,导致你收到错误信息的不是C++语言本身,而是你所使用的编译器。这听起来可能很学术,但这是一个重要的区别。虽然编译器诊断在所有主流实现中都非常复杂,但这并不会影响你的问题。
编译器错误信息之所以如此准确和精确,不是因为懒惰或历史原因,而是由于以下原因的综合影响:
追求精确性
为了不仅让一些新手能够理解,而导致那些真正的专业人士无法获取有用的信息,我们不能简化描述。例如,在你的示例中,“cv-qualifier”是准确和精确的,可以告诉你发生了什么。你可以采用其他方式进行描述,但这要么不能实际映射到正在使用的语言方面,要么就是错误的。
实现复杂性
诚然,模板诊断可能非常糟糕。近期GCC版本、Clang以及STLFilt等工具已经进行了改进,但最终,这很难做到。如果你认为自己可以做得更好,请随时向你喜欢的实现提交一个补丁。 :)
语言复杂性
C++语言非常复杂,这是它的本质所在。它非常强大,要比一些小型脚本语言或其他提供更好信息的语言更加强大。有人可能会认为其构造过于复杂,这是对该语言的常见批评。可以说,需要进行复杂而精确的诊断至少部分源自于此。
无法读取思维
这是第一个因素的变化。为了产生一组更简单的错误消息,编译器必须知道当你的代码出错时,你打算写什么。这是不可能的,除非能够读取你的心思。编译器可以试图猜测,但风险是猜测会出错。事实上,在像C++这样复杂的语言中,这种风险相当高。因此,我们更喜欢编译器直接告诉我们,然后我们训练自己的大脑将诊断与我们编写的代码进行匹配;一个专业的C++开发人员通常可以在几秒钟内认识到特定错误消息(由特定代码触发)的原因......即使该错误消息在表面上看起来完全无用。这就是我们行业的魔力!