c++隨筆之編譯器編譯原理

/*

C++編譯器原理:
1)首先明白聲明與定義是兩個不同的概念
extern int i;是聲明,int i;是定義
函數就更簡單了
2)編譯分爲:
預編譯:將宏替換,include等代碼拷貝過來
編譯:將代碼轉化爲機怨言
鏈接:一般會對每個cpp文件生成.obj文件。下面會詳細講解
1>每個obj文件至少也該包含三個表:未知符號表,導出符號表,地址重定義表
未知符號表包含了每個cpp文件自身obj找不到函數或變量的定義的時候,該函數,變量的聲明就被導入到未知符號表。
導出符號表包含了每個cpp文件變量,函數的定義,分爲外部鏈接符號與內部鏈接符號。
地址重定向:將每個obj向exe文件地址進行編譯,以確保外部鏈接的唯一性
2>連接器的工作過程:
首先他會將所有obj文件進行地址偏移,然後去訪問所有obj文件的未知符號表,通過遍歷導出符號表將未知符號表的符號的地址補充上
最後生成exe文件
3)每一個編譯單元是獨立的,不用擔心聲明爲重複的問題,你應該擔心定義是否會重複定義
4)一般的外部鏈接與內部鏈接符號的分類:
由外部鏈接的符號:默認的全局變量函數,類的成員變量函數。靜態內部成員函數之所以在cpp文件定義就是擔心他的重複定義問題,因爲他是外部連接,被include多次,自然就會報外部符合重複衝突錯誤
內部鏈接的符號:static,const修飾的全局變量都是內部鏈接。
*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章