【问题标题】:Is C# compiler not reporting all errors at once at each compile?C# 编译器是否不会在每次编译时立即报告所有错误?
【发布时间】:2011-01-14 23:07:01
【问题描述】:

当我编译这个项目时,它在错误列表窗口中显示 400+ 个错误,然后我去错误站点,修复一些,数字显示 120+ 个错误,然后在修复更多错误后,接下来再次编译 400+ 之类的报告。我可以看到错误列表窗口中出现了不同的文件,所以我认为编译器会在出现一定数量的错误后中止?

如果是这样,这是什么原因?不应该收集项目中存在的所有错误,即使它们超过 10K+?

【问题讨论】:

  • 通常,修复一些错误会使其他错误成为焦点。 直到你修复了损坏的燃油表问题,才能判断汽车是否存在燃油不足的问题。
  • @Ani:谢谢,我知道你的意思,但大多数错误是不同文件中的语法错误,据我所知,其中大部分都被文件忽略了。
  • 也许更重要的问题是为什么会有 400 多个错误?
  • @abelenky,这很容易通过忘记包含一些库来完成。
  • @abelenky:哈哈,这不是我的错误。只是他们要求我修复并使其可编译的一些项目。

标签: c# .net compiler-construction


【解决方案1】:

我一直想写一篇关于这个的博客文章。

您可能只是遇到了报告错误数量的硬编码限制。也有可能你遇到了一个更微妙和有趣的场景。

在命令行编译器和 IDE 编译器中有很多尝试管理错误报告的启发式方法。既要让用户易于管理,又要使编译器更加健壮。

简而言之,编译器的工作方式是尝试让程序通过一系列阶段,您可以在此处阅读:

http://blogs.msdn.com/b/ericlippert/archive/2010/02/04/how-many-passes.aspx

这个想法是,如果早期阶段出现错误,我们可能无法成功完成后期阶段,除非 (1) 进入无限循环,(2) 崩溃,或 (3) 报告疯狂的“级联”错误。所以发生的情况是,你得到一个错误,你修复它,然后突然下一个编译阶段可以运行,它发现更多的错误。

基本上,如果程序如此混乱以至于我们甚至无法验证有关其类和方法的基本事实,那么我们就无法可靠地给出方法体的错误。如果我们不能分析 lambda 主体,那么我们就不能可靠地给出将其转换为表达式树的错误。等等;在很多情况下,后面的阶段需要知道前面的阶段完成时没有错误。

这种设计的好处是 (1) 你首先会得到最“基本”的错误,没有很多嘈杂、疯狂的级联错误,并且 (2) 编译器更健壮,因为它没有'不必尝试对语言的基本不变量被破坏的程序进行分析。不利的一面当然是你的场景:你有 50 个错误,你把它们都修复了,然后突然又出现了 50 个。

【讨论】:

  • 谢谢埃里克。刚看到这个。完全有道理。级联错误是指如果缺少括号,它可以报告许多由此导致的错误,例如某些方法会在类外报告,等等,当前面的方法的右括号丢失时?
【解决方案2】:

当然它会在某个时候停止。

即使出现 1 个错误,其余的一切也都是可疑的。编译器会尝试恢复,但这不能保证成功。

因此,在任何不平凡的项目中,在遇到第一个错误(理论上最好的做法)和在不可靠的状态下继续前进之间,这是一个实际的决定。

最正确的操作是在出现 1 个错误后停止,但这会导致“一次修复 1 个”的繁琐情况。因此,编译器尝试重新同步到已知状态并报告下一个状态。但是一个错误可能会导致它后面的正确代码出现错误的错误,因此在某些时候它不再是明智的。

请参考您自己的案例:经过几次修复后,400+ 变为 120。

【讨论】:

  • 谢谢,你为什么说“正式”?没有了?
  • 知道了,但在这种情况下,它不显示编译器的健壮性吗?
  • 这不是关于健壮性,而是关于实用性。在第一个错误之后,不再有坚实的基础。
  • 但是如果程序员想要评估项目代码有多糟糕怎么办?就像它有 100K+ 错误一样,可以说它非常糟糕。还是您的意思是编译器“不再有坚实的基础”?
  • 另外,当我修复一个区域时,我看到数百条红线,所以当我重新实现它时,我擦除了这让我相信我只修复了一百条的区域。
【解决方案3】:

可根据MSDN进行配置

默认情况下,最大数量为 200 个错误和警告。

【讨论】:

  • 刚刚试了一下,没有做任何事情,还说这是针对数据库项目的。
  • @Joan,注意到现在,它与 Visual Studio 相关,所以也许我应该保留答案?
  • 当然,我认为它对某些人仍然有用。
猜你喜欢
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多