是否仍然编译了错误的程序?

时间:2014-02-11 08:34:49

标签: c++ c++11 compiler-construction error-handling

我对如何编译程序有疑问。如果我用c ++编写一个程序,我会犯错误,比如输入:

int x = 4; cout << x % 10 = 0; // assignment error

程序是否仍然会编译这个并且有错误,或者在错误修复之前程序是否完全没有编译?

换句话说,编译后的代码有错误吗?

2 个答案:

答案 0 :(得分:1)

这完全取决于编译器。标准区分 在可诊断的错误和未定义的行为之间。在这种情况下 未定义的行为,任何事情都可能发生;在很多情况下, 标准选择此类别是因为它不合理 期望编译器甚至能够检测到这样的错误。在 在可诊断错误的情况下,编译器是必需的 输出信息;除此之外,它可能或多或少地做它 想。

实际上,当编译器检测到错误时(包括,在 一些编译器,某些类型的未定义行为),它会 不仅输出错误信息,还会设置内部标志 防止代码生成,并导致它返回错误 系统的状态(以便构建系统不会继续 并尝试链接),它将尝试重新同步输入,在 为了找到更多错误。 (最后一点并不总是可行的 正确地说,并且单个错误导致的情况并不罕见 许多连锁错误,这并不意味着什么。)没有 然而,这是必需的,它的发生方式可能会有所不同 编译器,甚至依赖于编译器选项。其他编译器 选项,如将警告视为错误,可能会使编译器 不合规,因为它将无法在技术上合法编译 程式。 YMMV。

答案 1 :(得分:0)

我使用的所有编译器都不编译代码,直到所有错误都得到修复(除非有一些我从未听说过的隐藏编译器标志)。编译器,顾名思义想编译代码。如果它有错误,则意味着它无法理解代码中写入的内容。如果它无法理解它,它就无法将它(编译)转换为另一种语言(另一种编程语言或二进制)。

另外,阅读编译器上的维基百科页面: https://en.wikipedia.org/wiki/Compiler,它应该可以帮助您了解编译器的工作原理。