含引數的巨集與函式有什麼區別?
阿新 • • 發佈:2019-01-27
含引數的巨集有時完成的是函式實現的功能,但是並非所有的函式都可以被含引數的巨集所替代,各自特點如下:
- 函式呼叫時,首先求出實參表示式的值,然後帶入形參。而使用帶參的巨集只是進行簡單的字元替換。
- 函式呼叫是在程式執行時處理的,它需要分配臨時的記憶體單元;而巨集展開是在編譯時進行的,在展開時並不分配記憶體單元,也不進行值的傳遞處理,也沒有“返回值”的概念。
- 對函式中的實參和形參都要定義型別,兩者的型別要求一致,如果不一致,應進行型別轉換;而巨集不存在型別問題,巨集名無型別,它的引數也無型別,只是一個符號代表,展開時帶入指定的字元即可。巨集定義時,字串可以是任何型別的資料。
- 呼叫函式只可得到一個返回值,而用巨集可以設法得到幾個結果。
- 使用巨集次數多時,巨集展開後源程式會變得很長,因為每展開一次都使程式內容增長,而函式吊哦用不使源程式變長。
- 巨集替換不佔用執行時間,而函式呼叫則佔執行時間(分配單元、保留現場、值傳遞、返回)。
- 引數每次用於巨集定義時,他們都將重新求值,由於多次求值,具有副作用的引數可能導致不可預料的結果。而引數在函式被呼叫前只求值一次,在函式中多次使用引數並不會導致多種求值過程,引數的副作用並不會造成任何特殊的問題。