#define s(a,b) a*b //正確的巨集定義是#define s(r) ((r)*(r))area=s(3,2);第一步被換為area=a*b; ,第二步被換為area=3*2; 類似於函式呼叫,有乙個啞實結合的過程:
預處理(預編譯)工作也叫做巨集展開:在編譯之前,就將巨集名替換為字串。
優點:巨集 ——
1)**在預處理期被簡單文字替換, 類似於c++的內聯函式;
巨集替換只作替換,不做計算,不做表示式求解 . what's mean?
2)可完成函式呼叫的功能,又能減少系統開銷,提高執行效率。
巨集是在預編譯時執行的,
而函式是在執行時執行的。
在預處理階段即進行了巨集展開(巨集替換),在執行時不需要轉換,即在當地執行
。
巨集定義不分配記憶體,變數定義分配記憶體。巨集定義不存在型別問題,它的引數也是無型別的。[
3)函式呼叫在編譯後程式執行時進行,並且分配記憶體。巨集替換在編譯前進行,不分配記憶體 .
巨集展開不佔執行時間,只佔編譯時間,函式呼叫佔執行時間(分配記憶體、保留現場、值傳遞、返回值)
缺點:1)所占用的目標**空間相對較大。犧牲空間來換取時間 ,
函式體很大時不要#define,否則空間時間都得不到
2)不方便除錯
注意:1)巨集名和引數的括號間不能有空格
#define squ are(x) ((x) * (x)) ——————錯#define square(x ) ((x) * (x)) ——————錯
2)巨集定義末尾不加分號;
sudo cd為什麼不能夠執行
我想要cd到 etc docker,但是它給我乙個許可權不夠的錯誤,然後,我想到使用sudo cd etc docker時,它告訴我sudo cd 找不到命令。於是,鬱悶的我就去上網找了下原因。cd不是乙個應用程式而是linux內建的命令,而sudo僅僅只對應用程式起作用。sudo foo只意味著以...
sudo cd為什麼不能夠執行
ubuntu vm 0 16 ubuntu home cd root bash cd root permission denied ubuntu vm 0 16 ubuntu home sudo cd root sudo cd command not found ubuntu vm 0 16 ubu...
如何用 define巨集定義多行函式
在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。首先,函式呼叫會帶來額外的開銷,它需要開闢一片棧空間,記錄返回位址,將形參壓棧,從函式返回還要釋放堆疊。這種開銷不僅會降低 效...