致命错误和非致命错误的区别

Difference between fatal error and non-fatal error

本文关键字:致命错误 区别      更新时间:2023-10-16

当编译代码时,IDE中显示的致命错误和非致命错误的主要区别是什么?

在这两种情况下,编译器都会显示一个错误消息,程序不会被编译。致命错误是编译器或链接器中未定义的编译器错误吗?

致命错误可能会立即停止该翻译单元的编译。

编译器可能会在错误之后继续编译,以便向您显示更全面的问题列表。

虽然在您的情况下,似乎是预处理器发出了致命错误。也许这只是编译器编写器的心情。

区别在于:

  • 在正常错误上,编译器可以继续解析,这只是一个局部问题(例如未声明的变量),但编译器知道如何从中恢复。有些编译器在这个过程中走得更远,添加了缺失的;等)
  • 在致命错误时,编译器(或预处理器)不可能知道如何继续(就像"丢失"一样),因为结构性错误(丢失上下文)

这解释了为什么有时你修复了所有的编译错误,又出现了新的错误。

IDE不是编译器。它通常在命令行中启动另一个程序(如GCC…)进行编译。您的IDE只是一个美化的编辑器(在Linux上,emacs编辑器通常比IDE更好)。

大多数编译器不会给出致命错误,除了编译器错误,编译时缺乏资源,或者源输入无法进一步编译时:想想#include -一个不存在的头文件。

顺便说一句,有时编译器给出了很多错误(例如,试图编译一个伪装成C文件的英语或法语文学文本),进一步的编译没有意义。

差异通常基于编译单元(单个.cpp文件),尽管有时基于整个构建过程。

主要区别在于致命错误会导致它放弃编译。因此,例如,如果您通过包含不存在的头文件而得到致命错误,它将不会编译编译单元。

如果你得到一个常规错误,例如使用一个未定义的符号或遗漏一个右括号,它将尝试为你编译文件的其余部分。这可能会发现更多的错误,然后您可以在尝试重新编译之前一次性修复这些错误。当然,其中一些可能是由前一个引起的。

没有这样的"标准",缺少标头可能被认为是"致命的",因为没有标头很可能会有大量未定义的类型等,因此被认为是"不值得"报告它们。不同的编译器可以判定错误不是致命的,然后报告所有错误。

逻辑错误(例如,当块中的两个大括号都被遗漏时)在执行时产生影响。致命的逻辑错误会导致应用程序失败并提前终止。一个非致命的逻辑错误允许应用程序继续执行,但会导致它产生不正确的结果。

相关文章: