宏總結

宏即代碼替換,它可以替換數值字面值常量,字符串等非整型以及函數替換。如:

#define MAX 1024   
#define STRING "stringstring"
#define SWAP(a,b) {a=a+b;b=a-b;a=a-b}

1.宏的執行速度較快,一個程序到執行經過四個步驟,預處理、編譯、彙編、鏈接,而宏則在預處理階段已經將其代表的代碼替換到程序中了;

對於函數每次執行都需要調用、返回的額外開銷,速度較慢一些;

2.從代碼長度上,因爲在每次使用時,宏代碼都被插入到程序當中,所以程序的長度有時會大幅度增加,所以宏一般應該代表長度較小的代碼;

函數代碼只出現在一個地方,每次使用這個函數時,都調用此地方的同一份代碼;

3.從參數類型上,在以上舉例中宏參數並沒有指定類型,所以它是與類型無關的,即無論傳什麼類型的參數它都可以接收執行,所以它也是不安全的;

函數參數必定定義類型,傳遞什麼類型參數調用什麼類型函數;

4.對與宏的參數,它可以傳類型,因爲它只是做替換,如下:type爲一個類型,用於動態開闢內存

#define MALLOC(n,type) ((type*)malloc((n)*sizeof(type)))
函數參數則不可以傳遞類型;

5.宏參數具有副作用,當一個參數經過多次運算以後,將產生不同的結果,如傳入有自增、自加運算符的參數,就會帶來副作用,如:

#define Max(a,b) ((a)>(b)?(a):(b))
...
x=5;y=8;
z=MAX(x++,y++);

//替換:((x++)>(y++)?(x++):(y++))
//結果爲:x=6,y=10,z=9

較大的y值增了兩次;

函數的參數被調用前只求值一次,不會造成問題;

6.宏要注意操作符優先級,在寫宏表達式要注意都要加上括號,否則操作符優先級嚴重影響運算結果,如:

#define SUB(x) x*x
...
a=5;
b=SUB(a+1);
//結果:b=13   希望結果:b=36
函數參數在調用時已經求值,將值結果傳入函數,不會造成如宏一般的優先級問題。

宏還要注意:

當一個文件中出現了兩個同名的宏,如:

#define A 5
#define A 6
...
cout<<A<<endl;
//結果:6
編譯器會發出警告,但會選擇最後一次宏定義來替換它,可以例比爲變量的第二次賦值。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章