這個程式不編譯的原因是因為編譯器順序讀取檔案。當編譯器為函式的呼叫()對main()線6,不知道什麼補充的是,因為我們還沒有定義()到10號線!產生第乙個錯誤(「找不到識別符號」)。
當visual studio 2005到10線()實際的宣言,也抱怨將被重新定義。這是有點誤導性的,因為它從來沒有定義在第乙個地方。後來的版本的視覺工作室正確地忽略這個額外的錯誤資訊。
儘管第二個錯誤的冗餘,它是有用的,要注意,它是相當常見的乙個單一的錯誤產生(經常是多餘的)多個編譯器錯誤或警告。
規則:當解決在您的程式中的編譯錯誤時,總是首先解決產生的第乙個錯誤。
為了解決這個問題,我們需要解決的事實,編譯器不知道什麼是。有兩種常見的方法來解決這個問題。
選項1:排序函式呼叫()的定義是
#include int add(int x, int y)
int main()
前向宣告允許我們在實際定義識別符號之前告訴編譯器關於識別符號的存在性。
在函式的情況下,這使我們能夠在我們定義函式的身體之前,告訴編譯器乙個函式的存在。這樣,當編譯器遇到函式的呼叫時,它會理解我們正在做乙個函式呼叫,並且可以檢查,以確保我們正確地呼叫函式,即使它還不知道如何或在**定義的函式。
要編寫乙個函式的前向宣告,我們使用乙個稱為函式原型的宣告語句。函式原型由函式的返回型別、名稱、引數,但沒有函式體(花括號之間的一部分)。因為函式原型宣告,它以分號結束。
這是一本()函式的函式原型
#include int add(int x, int y); // forward declaration of add() using function prototype
int main()
宣告是滿足編譯器所需的所有。這就是為什麼使用乙個前向宣告是不夠的,以保持編譯器的快樂。但是,如果您忘記了識別符號的定義,鏈結器將要抱怨。
你會注意到「x」出現在兩類。在c++中,所有的定義也是宣告。由於「x」是乙個概念,它是預設的宣告太。這是大多數宣告的情況。
然而,有乙個小的宣告子集,這些宣告不是定義,如函式原型。這些被稱為純粹的宣告。其他型別的純宣告,包括對變數、類宣告和型別宣告的前瞻性宣告(在未來的教訓中你會遇到這些,但現在不需要擔心它們)。你可以為乙個識別符號的許多純宣告,你的願望(雖然有乙個以上的通常是多餘的)。
編譯器DIY 讀檔案
編譯器的前端詞法分析 將原始檔解析成乙個個的單詞流。為語法分析做準備。在詞法分析階段,我們要做的就是將詞分出來,而且確定單詞的型別,一般的程式語言的單詞符號能夠份為下面5種 1.keyword,如int,long等 2.識別符號,用來表示各種名字,如常量名,變數名等 3.常數。各種型別的常數,如12...
編譯器DIY 讀檔案
編譯器的前端詞法分析 將原始檔解析成乙個個的單詞流。為語法分析做準備。在詞法分析階段,我們要做的就是將詞分出來,而且確定單詞的型別,一般的程式語言的單詞符號能夠份為下面5種 1.keyword,如int,long等 2.識別符號,用來表示各種名字,如常量名,變數名等 3.常數。各種型別的常數,如12...
編譯方舟編譯器
環境 mac os parallels desktop 安裝ubuntu 16.04 安裝基礎包 sudo apt get y install openjdk 8 jdk git core gnupg flex bison gperf build essential zip curl zlib1g ...