簡體   English   中英

c++是如何編譯的? (關於變量聲明)

[英]How c++ is compiled? (Regarding variable declaration)

所以我瀏覽了這個視頻 - https://youtu.be/e4ax90XmUBc

現在,我懷疑如果 C++ 是編譯語言,也就是說,它會遍歷整個代碼並翻譯它,那么如果我做類似的事情

void main() {
   int a;
   cout<<"This is a number = "<<a;   //This will give an error (Why?)
   a = 10;
}

現在,對此的答案是我沒有定義a的值,這是我在學校學到的。 但是如果編譯器遍歷整個代碼然后翻譯它,那么我認為它不應該給出任何錯誤。 但是通過給出這樣的錯誤,在我看來 C++ 是一種解釋語言。 任何人都可以對此有所了解並幫助我解決我的困境嗎?

從技術上講,C++ 標准並不要求編譯器必須將 C++ 編譯成機器代碼。 例如, LLVM Clang首先將其編譯為IR (中間表示),然后才編譯為機器代碼。

類似地,編譯器可以將自身的副本嵌入到它編譯的程序中,然后在執行程序時編譯程序,立即調用它並隨后刪除可執行文件,這實際上與正在解釋的程序非常相似。 在實踐中,所有廣泛使用的 C++ 編譯器都會預先解析和匯編程序。

關於您的示例,“這將給出錯誤”的陳述有點模棱兩可。 我不確定您是說遇到編譯時錯誤還是運行時錯誤。 因此,我將討論這兩種可能性。

如果你得到一個編譯時錯誤,那么你的編譯器已經注意到你的程序有未定義的行為 這是您始終希望避免的事情(在某些情況下,例如當您的應用程序在 C++ 標准的 scope 之外運行時,例如在與某些硬件接口時,根據定義會發生 UB,因為某些行為未由標准定義)。 這是 static 分析的簡單形式。 該標准不要求您的編譯器通知您此錯誤,它通常是運行時錯誤,但您的編譯器無論如何都會通知您,因為它注意到您可能犯了一個錯誤。 例如,在g++上,可以通過使用-Wall -Werror標志來實現此類行為。

如果錯誤是運行時錯誤,那么您很可能會看到類似“內存訪問沖突”(在 Windows 上)或“信號 11”(在 Linux 上)這樣的消息。 這是因為您的程序訪問了未初始化的 memory,這是未定義的行為。

在實踐中,您很可能在運行時根本不會遇到任何錯誤。 除非編譯器在您的程序中嵌入了動態檢查,否則它只會默默地打印一個(看似)隨機值並繼續。 該值來自未初始化的 memory。

旁注: main返回int而不是void using namespace std; 被認為是有害的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM