C 主流預處理,編譯和鏈結過程

2021-08-31 17:38:15 字數 857 閱讀 8808

在c++的程式的編寫過程中,基本上都碰到過lnk2005的錯誤吧,下面就針對這個問題詳細分析:

首先,預處理階段:

這一過程,主要針對#include和#define進行處理,具體過程如下:

對於cpp檔案中經常會出現#include來包含某個標頭檔案,在進行預處理之後,所有的#include命令都將替換成該標頭檔案中的詳細內容,如果該標頭檔案中還包含另外的標頭檔案,採用同樣的方法進行遞迴處理。同樣#define亦是如此,對用它進行巨集定義的字元進行替換,這裡就是簡單的替換。所以整個預處理過程就是進行簡單的替換。

其次,預編譯過程

這一過程主要針對預處理之後的cpp檔案編譯稱為obj檔案,即目標檔案(注意,在這裡僅僅是針對cpp檔案,對頭檔案是不做任何處理的,所以在多檔案工程中定義全域性變數的時候,我們一定要記得把全域性變數定義在cpp檔案中,因為如果定義在標頭檔案中,我們要使用該變數的話很容易出現already define的錯誤)。主要是通過編譯器和彙編器生成二進位制檔案,便於鏈結處理。

對於這個,我給個例項和其解釋:

在鏈結的過程中,用extern申明的變數,我們很明確的知道這是乙個外部變數,那麼對於此,聯結器會到外部的obj檔案中區尋找該變數,如果說是我們在該obj檔案編譯的cpp中有該變數的定義的話,那麼這就不是乙個宣告了,而是乙個定義。所以,我們的這個obj檔案編譯的原始檔cpp,千萬不要包含有該變數定義的標頭檔案或者cpp檔案,否則就是重定義,也就是說有些重定義是在鏈結的時候才會確定的乙個錯誤,所以最好是在.h檔案中用extern進行宣告,然後再隨便乙個cpp檔案中進行定義。在你想要使用該變數的cpp檔案中只需要包含該標頭檔案即可。

第三,鏈結過程

如果寫程式中沒有足夠的警覺,在這個過程中極易出現鏈結錯誤。首先該過程主要是將眾多的obj檔案生成exe檔案。

理解程式編譯預處理與鏈結過程

首先熟悉一些預處理識別符號 file 進行編譯的檔案 line 檔案當前行號 使用預處理器將巨集引數轉換成乙個字串 將位於它兩邊的符號連線成乙個符號。示例 file 用linux指令來觀察它的預處理結果和最後輸出的結果 include int main line date time 也是同理,因此將...

c 編譯鏈結過程

llinux下編譯乙個c 程式的典型過程 1.編譯預處理 預編譯程式完成的工作,可以說成是對源程式的 替換 工作。經過這個過程,生成乙個沒有巨集定義 沒有條件編譯指令 沒有特殊符號的輸出檔案。2.編譯 優化階段 通過詞法分析 語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間 或彙編...

C語言 程式中的預處理 編譯 彙編和鏈結過程

這篇部落格主要記錄下c語言程式從原始檔變成可執行程式的過程,在linux系統中,gcc執行這個過程分為四個階段 預處理 編譯 彙編和鏈結,整個過程是通過編譯工具鏈實現的。命令 gcc e main.c o hello.i 說明 進行預處理操作時,預處理器會對以 開頭的預處理命令進行處理。比如 inc...