C語言巨集的初步認識及巨集與函式的區別

2021-07-24 07:32:10 字數 1185 閱讀 8797

一、巨集的初步認識。

1 巨集的定義:#define機制包括了乙個規定,允許把引數替換到文字當中去,這種實現通常稱為巨集(macro)或定義巨集。

巨集的宣告方式為:#define name(parament-list) stuff 其中name為巨集的名稱, parament-list為乙個由逗號隔開的符號表,他們可能出現在stuff中。其中name必須與引數列表的左括號相連,否則引數列表會被解釋為stuff的一部分。

例如:#define sum(a,b) a+b;

要特別注意的是例如如下程式:

比如這裡輸入a=5;預期為輸出36;但是實際輸出為11,因為引數x被替換成了5*5+1,所以實際運算為5*5然後加1。

所以在使用時應在表示式每個引數上加上()以及在整個表示式上加上()。

2#undef 

這個預處理指令一般用於移除乙個巨集

如果乙個巨集的名字需要被重定義,需要移除原來的定義必須使用#undef。 二 

函式與巨集

首先使用巨集與使用函式在語法上是完全一樣的 ,所以並不能在語法上區分二者。

乙個常見的約定:巨集的名字全部為大寫

一下是巨集與函式的其他不同

1 巨集可以頻繁的排程運算,比如在兩個表示式中求最大值。

#define max(a,b) (a>b?;a:b)

而函式要呼叫的**可能比實際執行的操作代價更大,所以使用巨集時更速度一些規模更小一些。

然而使用巨集的不利之處在於每次使用巨集的時候,乙份巨集定義的**會拷貝到函式中除非巨集很短,否則會大幅增加程式長度。

2 而最重要的一點是,函式的呼叫時引數必須宣告型別例如整形 浮點型等等,只能在適合相應型別的表示式上使用,然而巨集可以勝任各種型別換句話說巨集與型別是無關的。 3

4還有一些任務無法使用函式實現

例如:#define  malloc(n,type)((*type)malloc((n*)sizeof(type)))

int *p=malloc(25,int)

替換後為int *p=((int*)malloc(25)*sizeof(int));

這裡巨集的第二個引數為乙個型別。

C 語言 巨集定義和巨集函式

在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。我們來看乙個例子,比較兩個數或者表示式大小,首先我們把它寫成巨集定義 define max a,b a b a b 其次,把它...

C語言 巨集定義與函式的區別

在 開發過程中,有一些常用或者可以通用的功能或者 段,實現這些功能,既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。巨集 define 機制包括了乙個規定,允許把引數替換到文字中,這種實現常常稱為巨集,或者巨集定義。巨集對變數的 defi...

C 內聯函式與C語言巨集的比較

c 內聯函式 通過將內聯函式的編譯 與其它程式 內聯 起來,提高程式執行的速度。即 編譯器將使用相應的函式 替換函式呼叫。對於內聯 程式無需跳到另乙個位置處執行 然後在跳回來。因此,內聯函式的執行速度比常規函式稍快,但代價是要占用更多的記憶體。若在多個不同的地方呼叫同乙個內聯函式,則程式將包括該函式...