編譯器在對巨集預處理時,會:
1.將標頭檔案展開
2.去掉注釋
3.巨集替換
4.條件編譯
巨集替換時應注意的幾點:1).## 會把它兩邊的字元轉換為乙個字元
2).巨集要替換乙個函式或者引數時,需要加上()
3).鄰近字元連線原則
4).#value ,value指代乙個變數名,#會將該字面值轉換為乙個字串「value」
1.預處理時對預定義符號的執行:
file//當前正在編譯的原始檔
time//檔案被編譯的時間
date//檔案被編譯的日期
line//檔案當前的行號
stdc
printf(「time : %s\n,line : %d\n,date : %s\n,file : %d\n」,time,line,date,file);
預處理指令:
#include
#define
預處理器讀入源**,根據預處理指令對其進行修改,然後將處理過的源**遞交給編譯器
2.在對數值表示式進行求值的巨集定義時,要給每個引數都加上括號,以及給整體也要加上括號,以防引數中的操作符或者臨近操作符的不可**導致錯誤3.在對乙個**塊進行巨集定義時,最好使用do{}while(0)
4.下面程式執行出錯,因為在#define定義時後面加了乙個分號,導致在執行完debug語句後,後面還有乙個空語句,所以導致else沒有與之相匹配的if語句了,所以要記住,巨集定義後面不要加上分號
#define _crt_secure_no_warnings 1
#include
#include
#include
#define debug printf("time : %s\nline : %d\ndate : %s\nfile : %d\n",__time__ ,__line__ ,__date__ ,__file__ );
unsigned
char i = 0;
int main()
5.巨集替換時應注意的幾點:1)鄰近字串連線特性
#define _crt_secure_no_warnings 1
#include
#include
#include
#define m 9
#define print(format ,value) printf("the value is "format"\n",value);
int main()
2)使用預處理器將巨集引數轉換為字串(#arguement 被處理器處理為「arguement」)
結果如下:#define _crt_secure_no_warnings 1
#include
#include
#include
#define m 9
#define print(format ,value) printf("the value "#value " is "format"\n",value);
int main()
3)##將它兩邊的字元連線為乙個字元結果如下:#define _crt_secure_no_warnings 1
#include
#include
#include
#define m "hello"
#define n "world"
#define mn "hello bit"
#define link(m,n) m##n
int main()
條件編譯:
使用條件編譯,你可以選擇**的一部分是被正常編譯還是被忽略
基本結構:
#if (常量表示式) (常量表示式是由預處理器進行求值的)
statements
#endif
如果常量表示式的值為真,則statements部分被正常編譯,否則,預處理器就刪除掉statements部分
測試乙個符號是否被定義:
#ifdef symbol
#endif
#ifndef symbol
#endif
巨集函式和函式的區別:1)如果函式的**特別長,使用巨集定義時,會在每次呼叫巨集函式時都會將源**
替換到源程式中,程式的長度將大幅度增長;(巨集的缺點)
2)巨集引數的求值是在所有周圍表示式的上下文環境中,除非加上括號,否則鄰近操作符 的優先順序可能會影響使之產生不可預料的結果;(巨集的缺點)
3)引數每次用於巨集定義時,它們都將重新求值,由於多次求值,具有***的引數可能會產生不可預料的結果;(缺點)
4)巨集與型別無關,只要對引數的操作是合法的,它可以使用任何引數型別(優點)
5)巨集的執行速度快(優點)
函式:
1)函式**只出現在乙個地方,每次呼叫這個函式,都呼叫那個地方的同乙份**;(優點)
2)存在函式呼叫/返回的額外開銷(缺點)
3)函式引數只在函式呼叫時求值一次,它的結果值傳遞給函式,表示式的求值
結果更容易**;(優點)
4)引數在函式呼叫前只求值一次,在函式中多次使用引數並不會導致多種求值過程;(優點)
5)函式的引數時與型別有關的,如果引數的型別不同,則需要使用不同的引數;(缺點)
預處理器之巨集定義
以 開頭的命令都是預處理命令,預處理不是c語言的語句,不能被編譯器編譯。所以在編譯之前需要使用預處理器做檔案的預處理工作。在編譯之前,所有的預處理語句都要被處理 替換或展開 eg1 一般巨集定義 define num 100eg2 有引數的巨集定義 define s a,b a beg3 寫乙個巨集...
預處理器之巨集的使用
我們知道c程式在編譯過程之前,c語言預處理器首先對程式 作了了必要的轉換處理。巨集在c程式中是非常有用的,比如我們可以通過修改巨集定義來修改在程式中出現的所有例項。同時通過巨集定義還可以免去函式呼叫帶來的重大系統開銷。雖然巨集定義非常有用,但是巨集定義也是非常容易出錯的。主要表現為以下幾點 1 不能...
xcodebuild 如何定義預處理器巨集
您在xcodebuild命令列上傳遞gcc preprocessor definitions。請記住,對於類似shell的單詞拆分和引用處理,將重新評估引數,因此您需要小心,尤其是當您的巨集值不僅僅是簡單的1時 例如,nsstring文字 同樣重要的是在你設定的值內擴充套件gcc preproces...