gpt4 book ai didi

c++ - 有意义的诊断信息

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:08:43 25 4
gpt4 key购买 nike

看了几个帖子,我觉得很多问题的出现是因为编译器/实现不会多次发出非常有意义的消息(但并非总是如此)。对于错误消息至少非常令人生畏的模板来说尤其如此。一个例子可能discussion topic

因此,我想了解几点:

a) 为什么编译器有时无法提供更有意义/有用的错误消息?是纯粹的实际原因还是技术原因,还是有其他原因。 (我没有编译器背景)

b) 为什么他们不能提供对相关符合 C++ 标准节/节的引用,以便开发人员社区可以更好地学习 C++?

编辑:

引用线程 here再举个例子。

编辑:

引用线程 here再举个例子。

最佳答案

根本问题是编译器诊断会处理您没有编写的内容。

为了给您一个有意义的错误消息,编译器必须猜测您的意思,然后告诉您您的代码与那个有何不同。

如果您缺少分号,编译器显然无法在任何地方看到该分号。当然,它可以做的其中一件事就是猜测“也许用户漏掉了一个分号。毕竟这是一个常见的错误”。但是那个分号应该放在哪里呢?因为你犯了一个错误,代码无法解析成语法树,所以没有明确的指示“树中缺少这个节点”。并且可能有不止一个地方可以插入分号,以便周围的代码能够正确解析。此外,一旦发现可能的错误,您将尝试解析/重新编译多少代码?编译器可以插入分号,但至少必须重新开始解析该代码块。但也许它在代码中进一步引入了错误。所以也许整个程序应该重新编译,只是为了确保编译器提出的修复实际上是正确的。但这也不是一个选择。时间太长了。

假设你有这样的代码:

struct foo {
...
}

void bar();

这里有什么错误?看着它,您和我会说“您在类定义后缺少分号”。但是编译器怎么知道呢? void 可能是错字。也许您实际上打算写一个类型为 foo 的实例的名称。那么真正的错误是它后面跟着现在看起来像函数调用的东西。

所以编译器必须猜测。 “这看起来可能是一个类定义,它后面的内容看起来像是一个类型的名称。如果是这样,则用户缺少用于分隔它们的分号”。

而且猜测并不是一门非常精确的科学。事情变得更加复杂,因为每次编译器试图变得聪明并进行猜测时,如果猜测错误,它只会增加困惑。

所以有时候,输出一条简短的消息可能会更好,只说明我们确定的内容(例如,类定义不能后跟类型名称)。这不如说“你在类定义后少了一个分号”那么有用,但如果编译器猜错了,危害会小一些。

如果它告诉您缺少分号,而错误实际上是其他原因,那只是在误导您。因此,在最坏的情况下,简洁且帮助不大的错误消息可能会更好,即使在最好的情况下它并不那么好。

编写良好的编译器错误并不容易,尤其是在像 C++ 这样困惑的语言中。但话虽如此,一些编译器(包括 MSVC 和 GCC)可能会好得多。我相信更好的编译器诊断是 Clang 的主要目标之一。

关于c++ - 有意义的诊断信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3508628/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com