首先,推薦大家一本書《c與指標》,第14章講巨集講的非常的詳細。
如:
巨集可以非常頻繁地用於執行簡單的計算,比如在兩個表示式中尋找其中較大(或較小)的乙個:
#define max( a, b ) ( (a) > (b) ? (a) : (b) )
為什麼不用函式來完成這個任務呢?有兩個原因:
1.用於呼叫和從函式返回的**很可能比實際執行這個小型計算工作的**更大,
所以使用巨集比使用函式在程式的規模和速度更勝一籌。
2.但是更重要的是,函式的引數必須申明為一種特定的型別,所以它只能在型別合適的表示式上使用。
反之,上面的巨集可以用於整形、長整形、單浮點型、雙浮點型以及其他任何可以使用》操作符比較值大小的型別。
換句話說:
巨集是型別無關的。
和函式相比,使用巨集的不利之處在於每次使用巨集時,乙份巨集定義**的拷貝將插入到程式中,除非巨集非常短,否則使用巨集可能會大幅度增加程式的長度。
還有一些任務根本無法使用函式實現。讓我們仔細觀察下面的**:
#define
malloc(n
,
type
) \
( (type
*)malloc
( (n
) *sizeof
(type
) ) )
int*pi=
malloc
( 25,
int);
這個巨集的第二個引數是一種型別,它無法作為函式引數進行傳遞。
這個巨集替換完成之後:
int*
pi= ( (
int*)
malloc
( (25) *
sizeof
(int
) ) );
帶***的巨集引數
當巨集引數在巨集定義中出現次數超過一次時,如果這個引數具有***,那麼當你使用這個巨集時就可能出現危險,導致不可預料的結果。***就是在表示式求值時出現的永久性效果。例如,下面表示式
x+ 1;
可以執行幾百次,他每次獲得結果都是一樣的,這個表示式不具有***。但是
x++;
#define
max(a,
b) ( (
a) > (
b) ? (
a) : (
b) )
intx
= 5;
inty
= 8;
intz
=max(x
++,y
++);
printf
("x = %d, y = %d, z = %d\n",x
,y,z
);這裡較小的值計算了一次,但是較大的值卻計算了兩次。
***並不僅限於修改變數的值,getchar()也會產生***。呼叫這個函式將」消耗「輸入的乙個字元。
#define 巨集的行為和真正的函式相比存在一些不同的地方。
由於有了這些不同之處,所以讓程式設計師知道乙個識別符號究竟是乙個巨集還是乙個函式式非常重要的。不幸的是,使用巨集的語法和使用函式的語法是完全一樣的,所以語言本身並不能區分這個兩者。
面試常考的簡答題
程式 是一組指令的有序集合,它是乙個靜態的實體,本身沒有任何執行的含義。程序 它相對於程式不同,它是乙個動態的實體,它有自己的生命週期,所以可以說它因建立而產生,因排程而執行 程序是系統資源分配和排程的基本單位,用程序控制塊唯一標識乙個程序,在執行過程中擁有自己的記憶體單元,可以有乙個或者多個執行緒...
巨集函式與自定義函式的區別(面試總結)
在c語言中,函式式巨集定義和自定義函式的區別是什麼?自定義函式 巨集函式 1 函式式巨集定義的引數沒有型別,預處理器只負責做形式上的替換,而不做引數型別檢查,所以危險性高 但因為省去了函式的呼叫,返回,釋放,所以效率比自定義函式高 2 呼叫真正函式的 和呼叫函式式巨集定義的 編譯生成的指令不同。如果...
巨集函式與普通函式的區別
我們由問題展開 1.什麼是巨集函式?2.巨集函式與普通函式的相同點?不同點?3.巨集函式與普通函式的優缺點?在這之前看一下巨集的定義 巨集是根據一系列預定義的規則替換一定的文字模式。define buffer size 1024預處理階段,fun char malloc buffer size 會被...