C++中宏的陷阱

宏由於缺乏類型檢查,因此被有些程序員認爲「萬惡之首」,但若是宏使用的恰當,仍是有必定好處的。下面就將幾點宏使用中容易出現的陷阱:程序員

1.用宏定義表達式是,使用完備的括號。函數

好比:#define ADD(a,b)  a+bcode

初看這樣的宏感受是沒問題,但事實卻否則,宏只是作一種簡單的文本替換,好比你在程序中有這樣的調用ADD(a,b)*ADD(c,d),調用者的本意是對(a+b)*(c+d)求值,但實際是這樣的內存

a+b*c+d,有些人可能有點奇怪,爲何是這樣的,若是是函數調用就不會出現這種問題,宏與函數是有區別的,咱們看下相應的函數是怎麼定義的:博客

value_type ADD(value_type a,value_type b)   //value_type定義爲基本數據類型
	return a+b;

從宏和函數的定義中能夠看出,函數的參數有一個類型,而宏沒有,這也是爲何宏不作類型檢查的一個緣由,函數參數既然存在類型,一定在運行期間的某個時刻有本身的內存空間,而宏實在編譯預處理的時候就把相關聯的作了一個文本替換,因此它的調用跟函數調用存在區別。要避免宏中調用出現的問題,建議:用完備的括號保護宏的各個參數。即:#define ADD(a,b) ((a)+(b)),若是寫成是#define ADD(a,b) (a)+(b)的形式,像ADD(a,b)*c這種相似的調用也會出錯,因此宏最外面的括號不能少。it

2.用大括號將宏定義的多條表達式括起來編譯

有時,咱們定義一個宏時,不止簡單的一個表達式,例如:table

#define SWAP(a,b)\
	a ^=b;\
	b ^=a;\
	a ^=b;

像這樣的宏,表面上看起來沒什麼問題,我在CodeBlocks12.11上面運行了一下,能正確的顯示結果,但編譯的時間有點久,而我加上大括號,編譯相對的時間花費要少,我也不知道什麼緣由,看了class

一下書,書上給的建議是用大括號將宏定義的多條表達式括起來。即:數據類型

#define SWAP(a,b){\
{\
	a ^=b;\
	b ^=a;\
	a ^=b;\
}

第一次寫博客,語言組織不足之處還望各位見諒。

相關文章
相關標籤/搜索