巨集(Macro):在編譯時期進行展開,適合簡單的文字替換和代碼片段重用,無類型檢查,容易引發錯誤。
副程式(Subroutine):在程式執行時調用,適合封裝和重用複雜的邏輯功能,支持類型檢查和錯誤處理,雖有調用開銷但增強了代碼的可維護性。
在程式語言中,巨集(macro)和副程式(subroutine)都是用來重用程式碼的一種方式,但它們在實現和用途上有一些重要的區別:
巨集(Macro)
-
定義與使用:
- 巨集是一種編譯器預處理器指令,通常在程式碼編譯之前進行展開。
- 巨集使用定義(通常使用#define或macro指令)來指定一段程式碼或一個代碼片段,可以包含參數。
-
展開方式:
- 巨集在編譯過程中進行展開,這意味著每次巨集被調用時,它的內容都會替換到調用的位置。
- 巨集的展開是文字替換,並不是執行過程。
-
執行效率:
- 由於巨集是在編譯時期展開的,不涉及函數調用的開銷,因此在某些情況下可以提高執行效率。
- 但是,如果巨集被多次使用,會導致編譯後的程式碼變大,增加了程式的大小。
-
用途:
- 巨集常用於簡單的文字替換、常量定義、以及避免重複編寫相似的代碼片段。
- 由於巨集不進行類型檢查,容易引發難以發現的錯誤。
副程式(Subroutine)
-
定義與使用:
- 副程式是程式中的一段可以被調用的獨立代碼塊,通常被稱為函數(function)或程序(procedure)。
- 副程式通過函數或程序名稱調用,可以接受參數並返回結果。
-
執行方式:
- 副程式在程式執行過程中被調用,每次調用時會跳轉到副程式的代碼,執行完後返回調用點。
- 副程式調用涉及調用堆疊的操作,包括參數傳遞和返回地址的保存。
-
執行效率:
- 副程式調用有一定的開銷,包括參數傳遞和控制權的轉移。
- 但副程式的代碼僅在一個地方定義和存儲,因此不會像巨集那樣導致程式碼膨脹。
-
用途:
- 副程式用於實現邏輯功能的封裝和重用,增強程式的可讀性和維護性。
- 副程式支持類型檢查、返回值和錯誤處理,更適合於複雜邏輯的實現。