致命错误和非致命错误的区别
Difference between fatal error and non-fatal error
当编译代码时,IDE中显示的致命错误和非致命错误的主要区别是什么?
在这两种情况下,编译器都会显示一个错误消息,程序不会被编译。致命错误是编译器或链接器中未定义的编译器错误吗?
致命错误可能会立即停止该翻译单元的编译。
编译器可能会在错误之后继续编译,以便向您显示更全面的问题列表。
虽然在您的情况下,似乎是预处理器发出了致命错误。也许这只是编译器编写器的心情。
区别在于:
- 在正常错误上,编译器可以继续解析,这只是一个局部问题(例如未声明的变量),但编译器知道如何从中恢复。有些编译器在这个过程中走得更远,添加了缺失的
;
等) - 在致命错误时,编译器(或预处理器)不可能知道如何继续(就像"丢失"一样),因为结构性错误(丢失上下文)
这解释了为什么有时你修复了所有的编译错误,又出现了新的错误。
IDE不是编译器。它通常在命令行中启动另一个程序(如GCC…)进行编译。您的IDE只是一个美化的编辑器(在Linux上,emacs
编辑器通常比IDE更好)。
大多数编译器不会给出致命错误,除了编译器错误,编译时缺乏资源,或者源输入无法进一步编译时:想想#include
-一个不存在的头文件。
顺便说一句,有时编译器给出了很多错误(例如,试图编译一个伪装成C文件的英语或法语文学文本),进一步的编译没有意义。
差异通常基于编译单元(单个.cpp
文件),尽管有时基于整个构建过程。
主要区别在于致命错误会导致它放弃编译。因此,例如,如果您通过包含不存在的头文件而得到致命错误,它将不会编译编译单元。
如果你得到一个常规错误,例如使用一个未定义的符号或遗漏一个右括号,它将尝试为你编译文件的其余部分。这可能会发现更多的错误,然后您可以在尝试重新编译之前一次性修复这些错误。当然,其中一些可能是由前一个引起的。
没有这样的"标准",缺少标头可能被认为是"致命的",因为没有标头很可能会有大量未定义的类型等,因此被认为是"不值得"报告它们。不同的编译器可以判定错误不是致命的,然后报告所有错误。
逻辑错误(例如,当块中的两个大括号都被遗漏时)在执行时产生影响。致命的逻辑错误会导致应用程序失败并提前终止。一个非致命的逻辑错误允许应用程序继续执行,但会导致它产生不正确的结果。
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 用MacOS Mojave编译C++:致命错误:mpi.h:没有这样的文件或目录
- 如何修复valgrind启动时的致命错误(与libc6-dbg和libc6-dbg:i386连接)
- 在Raspbian上编译pybind11测试用例时出现致命错误
- 致命错误:特征/密集:VSC 中没有此类文件或目录
- v8::HandleScope::CreateHandle() # 中的致命错误无法在没有 HandleScope 的情
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 代码::块C++使用 MacOS 编译 Mojave : 致命错误: sys/cdefs.h: 没有这样的文件或目录
- 致命错误:找不到'boost/uuid/uuid.hpp'文件
- 致命错误 C1001 :vs2017 15.8.4 的内部错误(编译器文件"msc1.cpp",第
- 链接:致命错误LNK1104:无法打开文件"python37_d.lib"
- 造成致命错误:boost/fusion/iterator/equal_to.hpp 没有这样的文件或目录
- 多次调用本机方法时出现致命错误
- 在 Windows 10 下使用 GTest 的 CMake - 致命错误 LNK1104:无法打开文件"gtest.lib",但存在调试"gtestd.lib"
- NMAKE:致命错误 U1077:cl.exe 和 nmake.exe 返回代码'0x2'
- 【MacOSX 10.15.1】使用 odb 生成数据库,致命错误:wchar.h:没有这样的文件或目录 #include < wchar.h>
- 未知C++错误:致命错误:glibc检测到无效的stdio句柄
- pip install uwsgi 失败,出现 /usr/local/include/string/string.h:7:10:致命错误:找不到'sstream'文件?
- 致命错误和非致命错误的区别