巨集函式和自定義函式的區別?
自定義函式:
#includeint max(int a,int b)
int main()
巨集函式:
#include#define max(x,y) (x > y) ? x : y
int main()
c程式由源程式變為可執行檔案的三個階段是:
預處理階段,由預處理器對程式文字中的巨集進行展開。
編譯階段,由編譯器對經過預處理後的程式進行編譯,並生成目標檔案
鏈結階段,則鏈結器對目標檔案和用到的函式庫檔案進行鏈結,生成可執行檔案。
因此,巨集展開是在預處理階段完成的。
1:呼叫巨集時,首先對引數進行檢查,看是否包含由#define定義的符號,如果是,首先被替換
2:替換後的文字隨後被插入到程式中原來的位置,巨集,引數名被它們的值替換
3:再次對結果檔案進行掃瞄,看看它是否包含任何由#define定義的符號。如果是,就重複上述處理過程
1:巨集不能遞迴
2:當預處理器搜尋#define定義的符號的時候,字串常量的內容並不被搜尋
1:巨集做的是簡單的字串替換,巨集定義的引數沒有型別,預處理器只負責做形式上的替換,而不做引數型別檢查,所以危險性高;但因為省去了函式的呼叫,返回,釋放,所以效率比自定義函式高。函式的引數需要傳遞,引數是有型別的。
2: 巨集的引數替換是不經計算而直接處理的,而函式呼叫是將實參的值傳遞給形參。
3.:巨集在編譯之前進行,即先用巨集體替換巨集名,然後再編譯的,而函式顯然是編譯之後,在執行時,才呼叫的.因此,巨集占用的是編譯的時間,而函式占用的是執行時的時間.
4: 巨集的引數是不佔記憶體空間的,因為只是做字串的替換,而函式呼叫時的引數傳遞則是具體變數之間的資訊傳遞,形參作為函式的區域性變數,顯然是占用記憶體的.
5.:函式的呼叫是需要付出一定的時空開銷的,因為系統在呼叫函式時,要保留現場,然後轉入被呼叫函式去執行,呼叫完,再返回主調函式,此時再恢復現場,這些操作,顯然在巨集中是沒有的.
巨集函式與自定義函式的區別(面試總結)
在c語言中,函式式巨集定義和自定義函式的區別是什麼?自定義函式 巨集函式 1 函式式巨集定義的引數沒有型別,預處理器只負責做形式上的替換,而不做引數型別檢查,所以危險性高 但因為省去了函式的呼叫,返回,釋放,所以效率比自定義函式高 2 呼叫真正函式的 和呼叫函式式巨集定義的 編譯生成的指令不同。如果...
關於自定義函式和巨集定義
一 static 此定義型別有以下3種情況 1 當修飾乙個全域性變數時,這個變數的作用域被改變了,只能在當前檔案中呼叫 2 當修飾乙個區域性變數時,改變了變數的生命週期,直到程式結束才會被釋放。注 一般的呼叫函式中定義的區域性變數預設儲存在棧空間,而如果是被static修飾的區域性變數儲存在資料段內...
儲存過程和自定義函式的區別
儲存過程和自定義函式的區別 difference between procedure and user defined function 首先來看一下儲存過程和自定義函式的概念 一 什麼是儲存過程?儲存過程可以使得對資料庫的管理 以及顯示關於資料庫及其使用者資訊的工作容易得多。儲存過程是 sql 語...