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條預處理的命令...