C/C+編程筆記:C語言的編譯器工作原理

2020年12月07日23:40:10 科技 1738

以gcc編譯器為例子,編譯實際上總共經歷了四個階段

預處理--->編譯--->彙編--->鏈接

C/C+編程筆記:C語言的編譯器工作原理 - 天天要聞

1.預處理階段:編譯器以cpp文件作為一個單元,首先讀這個cpp文件,發現第一句與第二句包含一個頭文件,就會在所有搜索路徑中尋找這兩個頭文件,找到之後,就會到相應頭文件中再去處理宏、變數、函數聲明、嵌套的頭文件等。

檢測依賴關係,進行宏替換,看是否有重複定義與聲明的情況發生,最後將那些文件中所有的東東全部掃描進這個當前的cpp文件中,形成一個中間"cpp文件"。

在這一步中相當於將那個頭文件中的test變數掃描進了一個中間cpp文件,那麼test變數就變成了這個文件中的一個全局變數。在stdio.h這個頭文件中有一些函數的聲明,這時也把這些函數的聲明一股腦的掃描到了這個中間cpp文件中(只是掃描了函數的聲明,並沒有實現)。

C/C+編程筆記:C語言的編譯器工作原理 - 天天要聞

2.編譯階段:此時就為這個中間cpp文件的所有變數、函數形參分配空間(原則上,在這裡只能看到.h文件中函數、變數的聲明,為變數和函數的形參等分配空間),將各個函數編譯成二進位碼,按照特定目標文件格式生成目標文件。

在這種格式的目標文件中進行各個全局變數、函數的符號描述(編譯器維護一個符號描述表),將這些二進位碼按照一定的標準組織成一個目標文件。

C/C+編程筆記:C語言的編譯器工作原理 - 天天要聞

此時的每一個cpp文件都被編譯器編譯成了一個目標文件,同時每個目標文件都有一張符號表,這張符號表中記錄了這個cpp文件都用到了哪些變數,哪些函數,函數的參數是什麼類型的,有幾個參數。

同時為變數和函數形參開闢了內存空間。所以這裡編譯器把你這個cpp用到的所有的東西都記錄下來了,如果有重複定義或者沒有定義的變數、函數等,編譯器一下子就知道了。

3.連接階段:將上一步成生的各個目標文件,根據一些參數,連接生成最終的可執行文件,主要的工作就是重定位各個目標文件的函數、變數等,相當於將個目標文件中的二進位碼按一定的規範合到一個文件中。

C/C+編程筆記:C語言的編譯器工作原理 - 天天要聞

科技分類資訊推薦

引領科技豪華MPV新風尚 第二代騰勢D9西安車展亮相 - 天天要聞

引領科技豪華MPV新風尚 第二代騰勢D9西安車展亮相

兼具宜商氣度與家用溫情的科技豪華旗艦MPV,第二代騰勢D9迎來西安地區正式亮相。新車依託全球新能源MPV冠軍底蘊,以第二代刀片電池、雙閥雲輦-C、天神之眼5.0智駕等核心技術全面升級,兼顧商務體面與家庭舒適,為西北高端用戶帶來一站式全能出行解決方案。
採購禁入!科華數據材料造假被拒門外 - 天天要聞

採購禁入!科華數據材料造假被拒門外

本報(chinatimes.net.cn)記者胡雅文 北京報道這家趕上AI算力風口的公司,因投標材料造假,被相關採購方列入禁入名單兩年,其此前提出的複議申請也被正式駁回。相關採購平台近日發布公告,明確駁回科華數據股份有限公司(下稱「科華數據」,002335.SZ)此前提交的複議申請。早在一年前,科華數據已被認定在「信息通信樞紐...
快評樂道L80:15萬元級買大五座,這波值得沖? - 天天要聞

快評樂道L80:15萬元級買大五座,這波值得沖?

日前,樂道L80正式發布並開啟預售,其整車購買預售價為24.58萬元起,租電購買預售價則低至15.98萬元起。面對大型SUV市場「細分再細分」之競爭趨勢,這款樂道年度重磅新車都有哪些優勢?又能否成為「大五座SUV革新之作」?下面,圈哥就帶大家全方位感受。
成都直擊凱威德:純電全尺寸SUV的張揚與大氣 - 天天要聞

成都直擊凱威德:純電全尺寸SUV的張揚與大氣

4月22日,凱迪拉克以奧斯卡級盛典規格,將上海保利大劇院點亮為璀璨舞台,在品牌代言人倪妮與全場嘉賓的共同見證下,凱迪拉克全尺寸純電公路旗艦——凱威德耀然上市。新車共推出長續航四驅Pro、高性能四驅Ultra兩款配置,官方售價區間為46.88萬-50.88萬元。