i 可以編譯新增多個 C語言的編譯過程

2021-10-17 09:25:38 字數 1622 閱讀 8360

大家對c語言的編譯過程可能有個大致的理解,但是,詳細到每一步具體都幹了啥,可能有的人不是很清楚啦,也包括我,要不然,就不會做筆記了,哈哈...

① 步驟

編寫源程式(.c) → 預處理 → 編譯 → 彙編 → 鏈結

② 中間檔案

圖1 編譯流程

注:gcc的目標檔案(機器碼)的字尾是 .o  

visual c++的目標檔案的字尾是 .obj

1.預處理① 預處理指令

大家剛開始寫c語言程式時,肯定看到過這樣的指令:

#include

.h : 頭副檔名,標頭檔案包含c函式的宣告與巨集定義,可被多個原始檔中引用共享. 有兩種型別的標頭檔案,一種是程式設計師編寫的標頭檔案和編譯器自帶的標頭檔案,為區別這兩種型別的標頭檔案,寫法略有不同,如下:

自定義標頭檔案:#include "***.h"

庫檔案:#include

在程式中使用標頭檔案,需要使用c預處理指令#include來引用它. 前面我們已經看到過stdio.h標頭檔案,它是編譯器自帶的標頭檔案.

其實預處理指令不僅僅只有#include,如下:(帶#的指令,它不是語句,所以不需要在後面加分號)

表1 預處理指令與意義

② 現在我們來說一下預處理操作到底幹了些什麼 ?

✦ 將所有的define刪除,並且展開所有的巨集定義,也就是:字元替換;

✦ 處理所有的條件編譯指令,#if, #ifdef, #ifudef等;

✦ 處理#include,將#include指向的標頭檔案插入到該行;

✦ 刪除所有注釋;

✦ 新增行號和檔案標示,這樣的在除錯和編譯出錯時才知道是哪個檔案的哪一行;

✦ 保留#pragma編譯指令,因為編譯器需要使用它們.

2.編譯

編譯的過程實質是把高階語言翻譯為組合語言的過程,那到底對.i檔案 做了些什麼呢?

✦ 詞法分析;

✦ 語法分析;

✦ 語義分析;

✦ 優化後生成相應的彙編**.

高階語言組合語言

其實我們經常把編譯和彙編統統說成:編譯.
彙編就是將組合語言轉成機器語言

組合語言 → 機器語言 (二進位制)

✦ 當源程式很大時,可以將它分為多個源程式,通過編譯可以形成多個目標檔案(unix: .o),這時我們需要用鏈結器把它們連線到一起,生成乙個可執行檔案;

✦ 程式中呼叫了某個庫檔案中的子程式, 需要將這個庫檔案和該程式生成的目標檔案連線到一起,生成乙個可執行檔案;

✦ 乙個源程式編譯後,得到了存有機器碼的目標檔案,目標檔案中的有些內容還不能直接用來生成可執行檔案,鏈結器程式將這些內容處理為最終的可執行資訊. 所以,在只有乙個源程式檔案,而又不需要呼叫某個庫中的子程式時,也必須用鏈結器對目標檔案進行處理,生成可執行檔案.

參考:c語言真正的編譯過程 - 無憂小菜 -

c語言編譯過程詳解 - carpenterlee -

c語言的編譯過程

i 可以編譯新增多個 編譯原理分析

編譯原理 如圖 預編譯階段 在預編譯階段,發揮作用的是預處理器 cpp 預處理器讀取.cpp檔案,對其中的偽指令 開頭的指令 和特殊符號進行處理,特別的,對 include指令進行遞迴處理,包含需要的標頭檔案。常見的偽指令有 define include 包括你需要的標頭檔案 在你的預處理器處理過後...

乙個可以隨意新增多個序列的tag函式

author supersha qq 770104121 由於在沒有規劃好的情況下寫的這個 寫的比較粗糙,也沒有新增注釋。主要特點 j ascript 和html完全分離 可以隨意新增多個子div標籤,自動擴充套件 j ascript 複製 如下 html 複製 如下 tag demo 1,i wi...

C語言的條件編譯

預處理程式提供了條件編譯的功能。可以按不同的條件去編譯不同的程式部分,因而產生不同的目標 檔案。這對於程式的移植和除錯是很有用的。條件編譯有三種形式,下面分別介紹 1.第一種形式 ifdef 識別符號 程式段1 else 程式段2 endif 它的功能是,如果識別符號已被 define命令定義過則對...