關於預處理 巨集和函式 編譯鏈結的理解

2021-07-23 19:53:07 字數 1096 閱讀 5048

1.預處理識別符號

__file__    //當前編譯的原始檔

__line__    //檔案當前所屬行號

__date__  //檔案被編譯日期

__time__    //檔案被編譯時間

#           //將其後的巨集引數進行字串化操作,簡單講就是在它引用的巨集變數左右各加上乙個雙引號

##          //將其兩邊符合連線成乙個符號

eg:#define cat(str1,str2)\

str1##str2

printf("%d\n",cat(aa,bb));

2.巨集和函式的區別

巨集是型別無關,可以頻繁的用於執行簡單的計算。函式不行。

eg:  #define malloc(n,type) \

((type *)malloc((n)*sizeof(type)))

int *pi=malloc(25,int);

//int *pi=((int*)malloc((25)*sizeof(int)));

區別:(1)每使用一次,巨集**就插入到程式中一次,**長度將增加;函式中**只出現在乙個地方,使用時,呼叫即可。

(2)巨集的執行速度更快;函式存在函式呼叫/返回的額外開銷。

(3)巨集中鄰近的操作符優先順序會產生不可預料的結果。加do{}while(0);函式表示式求值結果更容易**。

(4)引數每次用於巨集定義時,都將重新進行求值,引數的***會帶來不可預料的結果。函式引數則只在被呼叫時求一次值。

(5)巨集與型別無關,函式的引數是與型別有關的。

3.編譯鏈結的整個過程及每個過程

1.原始檔(.c/.cpp)

2.預處理(.i):完成巨集替換、標頭檔案展開、去注釋、條件編譯。

3.編譯(.s):生成彙編**。

4.彙編(.o):將彙編指令轉換為二進位制。

預處理,巨集,隱藏在背後的編譯和鏈結

一.預處理器 在程式設計的時候,第乙個步驟就是預處理 就是編碼之前對其進行文本性的操作。主要有四個作用 1.巨集替換 2.標頭檔案的展開 3.去注釋 4.條件編譯 是否有過這種經歷,編譯的 自己不滿意,過段時間要找,然後找了很長時間,這是可以通過程式找到當時 的目錄檔案,日期,以及行數和時間 都可以...

預處理,編譯,彙編和鏈結

1 我們有乙個hello.c檔案,用最簡單的命令gcc hello.c 生成 a.out 這個過程可以分為四個步驟 預處理 prepressing 編譯 compilation 彙編 assembly 和鏈結 linking 一 預編譯 1.將所有的 define刪除,並展開所有的巨集定義 2.處理...

gcc編譯的背後 預處理 編譯 彙編和鏈結 一

本次將分為四個章節來講,分別來講述一下gcc編譯背後的四個步驟。第一部分 預處理。相信大家對這一塊其實挺了解了,下面我就獻醜,以自己的理解再講一遍。預處理是c語言從源 變成可執行程式的第一步,它包括標頭檔案的包含,巨集定義擴充套件,條件編譯的選擇等。首先介紹一下預處理的命令 一共有12條預處理的命令...