(#define)巨集可以頻繁的用於執行簡單的計算。但一般是巨集的**很短,才使用巨集,否則使用巨集會使程式長度大幅度提公升。
函式可以寫一些複雜的的計算。
比如下面這個比較大小的兩個數字的大小
#include#include#define max(a,b) ((a)>(b)?(a):(b))
int main()
這裡不用函式而用巨集的原因有兩個:
1.因為使用函式呼叫比使用巨集的工作代價大,所以對於這類程式使用巨集比使用函式的速度更快。因為巨集只是替換不需要呼叫,而函式需要呼叫。
2.巨集是與型別無關的。函式的引數使用時必須宣告型別,只有型別合法才可以使用。然而,巨集可以使用與整型、長整型、單浮點型、雙浮點型等等。
還有一些**是使用函式無法實現的
比如下面這個動態分配空間使用函式是無法實現的:
#include#define malloc(a, type) \
((type*)malloc((a)*sizeof(type)))//動態申請了10個type型別的空間
int main()
因為巨集的第二個引數是乙個型別,型別可以作為巨集的引數進行傳遞,不可以作為函式的引數進行傳遞。
#define巨集與函式的比較
屬性#define巨集 函式
**長度
一般是巨集的**很短,才使用巨集,否則使用巨集會使程式長度大幅度提公升。
函式的**只出現在乙個地方,每次代用都去那個地方呼叫。
執行速度
比函式快
函式需要呼叫,返回值會有開銷
操作符優先順序
函式的引數是在周圍表示式的上下文的環境裡,建議給巨集的每個引數帶括號
函式的引數只在呼叫時求值一次,他的結果值傳遞給函式,表示式的結果更容易**
引數求值
引數每次用於巨集定義時,都進行求值,由於多次求值,帶有***的引數有可能帶來其他意料之外的結果
引數在函式被呼叫前只求值一次,在函式中多次使用引數並不會帶來多種求值。
引數型別
巨集與型別無關
函式的引數與型別有關
RPA 和 Excel 巨集有什麼區別
最近,rpa 作為自動化日常工作越來越引起了大家的關注。同樣,許多人可能已經使用 excel 的巨集功能作為自動執行日常任務的工具。可能很多的朋友想知道 excel 巨集和 rpa 機械人有什麼樣的功能以及如何單獨使用它們。rpa 的基本概念 rpa 機械人過程自動化 機械人過程自動化 是一種機械人...
含引數的巨集與函式有什麼區別?
含引數的巨集有時完成的是函式實現的功能,但是並非所有的函式都可以被含引數的巨集所替代,各自特點如下 函式呼叫時,首先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。函式呼叫是在程式執行時處理的,它需要分配臨時的記憶體單元 而巨集展開是在編譯時進行的,在展開時並不分配記憶體單...
指標函式和函式指標有什麼區別
1,這兩個概念都是簡稱,指標函式是指帶指標的函式,即本質是乙個函式。我們知道函式都又返回型別 如果不返回值,則為無值型 只不過指標函式返回型別是某一型別的指標。其定義格式如下所示 返回型別識別符號 返回名稱 形式參數列 返回型別可以是任何基本型別和復合型別。返回指標的函式的用途十分廣泛。事實上,每乙...