C語言 巨集和函式的區別

2021-07-23 19:14:45 字數 1031 閱讀 5753



1,巨集:

巨集定義將乙個識別符號

定義為乙個字串,源程式

中的該識別符號均以指定的字串來代替。

巨集的書寫形式:

#define 《巨集名》(《參數列》) 《巨集體》

2,函式

函式有庫函式和自己編寫的函式,庫函式是用來定義一些經常用的大家都知道的函式,自定義的函式是大家為了實現一些功能來自己編寫的函式

3,巨集和函式的區別

(1)巨集只佔編譯時間,函式呼叫則占用執行時間(分配單元,儲存現場,值傳遞,返回),每次執行都要載入,所以執行相對巨集會較慢。

(2)使用巨集次數多時,巨集展開後源程式很長,因為每展開一次都使程式增長,但是執行起來比較快一點(這也不是絕對的,當有很多巨集展開,目標檔案很大,執行的時候執行時系統換頁頻繁,效率就會低下)。而函式呼叫不使源程式變長。

安全性考慮:

(3)函式呼叫時,先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。

(4)函式呼叫是在程式執行時處理的,分配臨時的記憶體單元;而巨集展開則是在編譯時進行的,在展開時並不分配記憶體單元,不進行值的傳遞處理,也沒有「返回值」的概念。

(5)對函式中的實參和形參都要定義型別,二者的型別要求一致,如不一致,應進行型別轉換;而巨集不存在型別問題,巨集名無型別,它的引數也無型別,只是乙個符號代表,展開時帶入指定的字元即可。巨集定義時,字串可以是任何型別的資料。

(6)巨集的定義很容易產生二義性,如:定義#define s(a) (a)*(a),**

s(a++),巨集展開變成(a++)*(a++)這個大家都知道,在不同編譯環境下會有不同結果。

結構性考慮:

(7)呼叫函式只可得到乙個返回值,且有返回型別,而巨集沒有返回值和返回型別,但是用巨集可以設法得到幾個結果。

(8)函式體內有bug,可以在函式體內打斷點除錯。如果巨集體內有bug,那麼在執行的時候是不能對巨集除錯的,即不能深入到巨集內部。

(9)c++中巨集不能訪問物件的私有成員,但是成員函式就可以。

巨集和函式的區別(C語言)

一 長度 1 每次使用時,巨集 都被插入到程式中。除了非常小的巨集之外,程式的長度將大幅度增長。2 函式 只出現於乙個地方,每次使用這個函式時,都呼叫那個地方的同乙份 二 執行速度 1 define 巨集 更快。2 函式存在函式呼叫或返回的額外開銷。三 操作符優先順序 1 巨集引數的求值是在所有週期...

C語言巨集和函式的區別

首先巨集的使用 有標準巨集和巨集函式 標準巨集就是將乙個大寫字母或單詞定義成不可改變的常量,使用時直接文字替換,如 define n 1000巨集函式是將乙個函式簡化為大寫的字母或單詞,多次使用時會很方便。要注意的是巨集函式裡邊,表示式和引數都要帶上圓括號,否則可能會出現由於優先順序或求值順序而導致...

在c語言中巨集和函式的區別

關於c語言中的巨集,自己來總結一下。簡單來說,巨集就是在c語言中簡單的文字替換,這是簡單的理解,嚴格的說不是很準確,因為在巨集中存在乙個文字條件編譯,所以有一定的判斷,巨集是在c語言中的預處理階段就已經處理完成。函式呢,就要分為兩種了。第一種封裝成庫。如果函式在動態庫中,那麼呼叫就是在函式執行階段 ...