2014-02-11 57 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

這真的取決於編譯器。該標準區分可診斷錯誤和未定義行爲之間的 。在未定義行爲 的情況下,任何事情都可能發生;在許多情況下, 標準選擇了這個類別,因爲 期望編譯器甚至能夠檢測到這樣的錯誤是不合理的。在 可診斷錯誤的情況下,編譯器需要輸出 消息;除此之外,它可能或多或少地做它想要的東西。

在實踐中,當一個編譯器檢測到錯誤(包括,在 一些編譯器,某些類型的未定義的行爲),它將 不僅輸出錯誤消息,它將設置一個內部標誌 以防止代碼生成,並使其錯誤 狀態返回到系統(以便構建系統將不會繼續 並試圖鏈接),它會嘗試重新同步輸入,在 爲了找到更多的錯誤。 (最後並不總是可行 正確的,這不是罕見的單錯誤導致 衆多的連鎖錯誤,這並不意味着什麼。)的 這一切都不是必需的,然而,以及它是如何發生的一切可能在編譯器的 之間變化,甚至取決於編譯器選項。其他編譯器 選項,如警告視爲錯誤,可能使不符合標準的編譯器 ,因爲它將無法編譯技術上法律 程序。因人而異。