預處理過程主要處理那些源**檔案只能夠的以」#」開始的預編譯指令。比如「#include」、「#define」等,主要處理規則如下:
(1)將所有的「#define「刪除,並且展開所有的巨集定義;
(2)處理所有條件預編譯指令,比如」#if「、」#ifdef「、」#elif「、」#else「、#endif;
(3)處理」#include「預編譯指令,將被包含的檔案插入到該預編譯指令的位置。注意:這個過程是遞迴進行的,也就是說被包含的檔案可能還包含其他檔案;
(4)刪除所有的注釋」//「和」、」/**/「;
(5)新增行號和檔名標識,比如#2 「test.c」 2,以便於編譯時編譯器產生除錯用的行號資訊及用於編譯時產生編譯錯誤或警告時能夠顯示行號;
(6)保留所有的#pragma編譯器指令,因為編譯器需要使用它們;
編譯過程就是把預處理完的檔案進行一系列的詞法分析、語法分析、語義分析以及優化,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間**表示或彙編**,這個過程往往是我們所說的整個程式的構建的核心部分,也是最複雜的部分之一。
彙編實際上指彙編器(as)把組合語言**翻譯成目標機器指令的過程。目標檔案中所存放的也就是與源程式等效的目標的機器語言**。目標檔案由段組成。通常乙個目標檔案中至少有兩個段:
**段:該段中所包含的主要是程式的指令。該段一般是可讀和可執行的,但一般卻不可寫。
資料段:主要存放程式中要用到的各種全域性變數或靜態的資料。一般資料段都是可讀,可寫,可執行的。
由匯程式設計序生成的目標檔案並不能立即就被執行,其中可能還有許多沒有解決的問題。
例如,某個原始檔中的函式可能引用了另乙個原始檔中定義的某個符號(如變數或者函式呼叫等);在程式中可能呼叫了某個庫檔案中的函式,等等。所有的這些問題,都需要經鏈結程式的處理方能得以解決。
鏈結程式的主要工作就是將有關的目標檔案彼此相連線,也即將在乙個檔案中引用的符號同該符號在另外乙個檔案中的定義連線起來,使得所有的這些目標檔案成為乙個能夠誒作業系統裝入執行的統一整體。
我們在linux使用的gcc編譯器便是把以上的幾個過程進行**,使使用者只使用一次命令就把編譯工作完成,這的確方便了編譯工作,但對於初學者了解編譯過程就很不利了,下圖便是gcc**的編譯過程:
2.c 編譯、鏈結、載入
3.c語言的編譯鏈結過程的介紹
c語言編譯 鏈結過程
c語言的編譯鏈結過程 把c程式 源 轉換成可以在機器上執行的程式 可執行 需要進行編譯和鏈結的過程。1 編譯 主要包含兩個過程 1 預處理 巨集定義 檔案包含 條件編譯。在正式開始編譯之前根據預處理命令來修改原始檔的內容 2 編譯 優化 通過詞法分析和語法分析將指令翻譯成彙編 2 彙編 把組合語言 ...
編譯與鏈結
首先,我們可以將所有東西都放在乙個.cpp檔案內.然後編譯器就將這個.cpp編譯成.obj,obj是什麼東西?就是編譯單元了.乙個程式,可以由乙個編譯單元組成,也可以有多個編譯單元組成.假如你不想讓你的源 變得很難閱讀的話,就請使用多個編譯單元吧.乙個函式不能放到兩個編譯單元裡面,但兩個以上就可以分...
C 中的編譯與鏈結
目錄 前言 c 有個最大的特點,那便是編譯型語言,相比於python這種解釋型語言,c 在編譯階段就進行了許多處理,在執行階段便具有高效性,本篇主要講解c 中的編譯與鏈結 1 一開始的c 是乙個簡單的加工模型,如下圖所示 這樣會存在一些問題 2 為了解決以上問題,引入了分塊處理的方式 編譯鏈結模型的...