2014-02-11 59 views
0

我有一个关于如何编译程序的问题。如果我写在C++程序,我犯了一个错误,每说,通过键入:程序是否仍然编译错误?

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

会将程序仍然编译这个和有错误,或者是根本,直到错误并不编译的程序固定?

来表述方式不同,可编译的代码有错误?

+1

通过你的编译器运行它并找出?或者重述这个问题,因为我并不是一个人在想什么......“嗯?” – WhozCraig

+0

@OMerObaid我认为这可能很难找出一个在线编译器。他应该在他的机器上试试这个,并检查一下,同时使用在线编译器,如果它不编译,他不能真正检查任何事情,除非它没有运行:) – JBL

+0

直到有编译器才会编译成功错误 – Subhajit

回答

0

我用不代码编译所有编译直到所有的错误是固定的(除非有一些隐藏的编译器标志我从来没有听说过)。编译器,顾名思义就是想编译代码。如果它有错误,则意味着它无法理解代码中写的内容。如果它不能理解它,它不能将它翻译(编译)成另一种语言(另一种编程语言或二进制)。

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

+1

要小心。 C++是一门复杂的语言,并不那么简单。与模板系统有关的情况下,可以成功编译出错的程序。例如,一个函数SFINAEd带走了哪个主体包含很多错误。直到第二阶段(即时阶段),函数的主体才被分析,因为模板没有实例化,代码没有被检查。 – Manu343726

+1

从技术上讲,程序本身编译成功,因为程序不包含错误(程序生成)。但模板系统只是一个代码生成器(即一个元编程系统),有些情况下(如上例),你的源代码包含错误,但元程序不使用错误代码,所以生成的程序没有错误,并且可以成功编译。因此,更好的答案可能是**在C++中,您的源代码可能包含错误,但仅限于最终程序不使用该代码。** – Manu343726

+1

唉,即使这是过度简化。考虑如果(false){rarrrrrrrrrrrrrr} –

1

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

在实践中,当一个编译器检测到错误(包括,在 一些编译器,某些类型的未定义的行为),它将 不仅输出错误消息,它将设置一个内部标志 以防止代码生成,并使其错误 状态返回到系统(以便构建系统将不会继续 并试图链接),它会尝试重新同步输入,在 为了找到更多的错误。 (最后并不总是可行 正确的,这不是罕见的单错误导致 众多的连锁错误,这并不意味着什么。)的 这一切都不是必需的,然而,以及它是如何发生的一切可能在编译器的 之间变化,甚至取决于编译器选项。其他编译器 选项,如警告视为错误,可能使不符合标准的编译器 ,因为它将无法编译技术上法律 程序。因人而异。