【问题标题】:Is a program with errors still compiled?仍然编译有错误的程序吗?
【发布时间】:2014-02-11 08:34:49
【问题描述】:

我有一个关于如何编译程序的问题。如果我正在用 c++ 编写一个程序并且我犯了一个错误,比如说,输入:

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

程序是否仍然会编译这个并有错误,或者程序在错误修复之前根本不编译?

换个说法,编译后的代码会出错吗?

【问题讨论】:

  • 通过您的编译器运行它并找出答案?或者改写这个问题,因为我不是一个人在想……“嗯?”
  • @OMerObaid 我认为使用在线编译器可能很难解决这个问题。他宁愿在他的机器上尝试这个并检查输出,而使用在线编译器,如果它没有编译,他真的不能检查任何东西,除了它没有运行的事实:)
  • 直到出现编译错误才会编译成功

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在修复所有错误之前,我使用的所有编译器都不会编译代码(除非有一些我从未听说过的隐藏编译器标志)。编译器,顾名思义就是要编译代码。如果它有错误,则意味着它无法理解代码中写的内容。如果它不能理解它,它就不能将它翻译(编译)成另一种语言(另一种编程语言或二进制)。

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

    【讨论】:

    • 小心。 C++ 是一门复杂的语言,并不是那么简单。在某些与模板系统相关的情况下,可以成功编译出错的程序。例如,一个函数 SFINAE 删除了包含很多错误的主体。直到第二阶段(实例化阶段)才解析函数体,所以因为没有实例化模板,所以不检查代码。
    • 技术上程序本身编译成功,因为程序不包含错误(程序生成)。但是模板系统只是一个代码生成器(即元编程系统),并且在某些情况下(如上面的示例),您的源代码包含错误,但元程序没有使用错误代码,因此生成的程序没有错误并且可以编译成功。因此,更好的答案可能是在 C++ 中,您的源代码可能包含错误,但前提是最终程序不使用该代码。
    • 唉,这还是过于简单化了。考虑if (false) { rarrrrrrrrrrrrrr }
    • @Manu343726 这是不正确的。一切都在第一阶段解析。一些名称查找也在第一阶段完成。第一阶段唯一没有做的是从属名称查找。基于此,我认为这样的程序没有错误(唯一可能出现的错误需要特定的模板参数,这些参数不会在程序中传入,QED)。
    猜你喜欢
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 2015-10-16
    • 1970-01-01
    • 2015-04-20
    • 2020-05-23
    相关资源
    最近更新 更多