1. 程式人生 > >第9課 - 函數定義及調用

第9課 - 函數定義及調用

函數的調用 align 應用 abs end 語言 命令集 func home

第9課 - 函數定義及調用

1. makefile中的函數

  (1)make 解釋器提供了一系列的函數供 makefile 調用

  (2)在 makefile 中支持自定義函數實現,並調用執行

  (3)通過 define 關鍵字實現自定義函數

2. 在makefile中自定義函數

  (1)自定義函數的語法

    技術分享

    其中,$(0) 代表被調用的函數名,$(1) , $(2) , $(3) ... 代表調用函數時後面的傳參

  (2)深入理解自定義函數

    — 自定義函數是一個多行變量,無法直接調用

    — 自定義函數是一種過程調用,沒有任何的返回值。函數和過程是兩種東西,C語言中進行了統一,加return是函數,不加return是過程。

    — 自定義函數用於定義命令集合,並應用於規則中

 1 # 演示自定義函數的使用
 2 
 3 .PHONY : test
 4 
 5 define func1
 6     @echo "My name is $(0)"
 7 endef
 8 
 9 define func2
10     @echo "my name is $(0)"
11     @echo "param 1 => $(1)"
12     @echo "param 2 => $(2)"
13 endef
14 
15 test :
16     $(call func1)
17     $(call func2, swj, cool)
18 19 # 輸出結果 20 My name is func1 21 my name is func2 22 param 1 => swj 23 param 2 => cool

    自定義函數的本質就是多行變量,只不過加上了call關鍵字。 $(call func , param1, param2, ...) 首先將參數傳遞到多行變量裏的命令中,然後將命令原地展開。

 1 .PHONY : test
 2 
 3 define func1
 4     @echo "My name is $(0)"
 5 endef
 6 
 7 test :
 8     $(call func1)
9 $(func1) 10 11 # 輸出結果:註意兩者的區別,call會傳參後原地展開,多行變量不會傳參直接原地展開 12 My name is func1 13 My name is

3. make解釋器中的預定義函數

  (1)預定義函數的概念

    — make 的函數提供了處理文件名,變量和命令的函數

    — 可以在需要的地方調用函數來處理指定的參數

    — 函數在調用的地方被替換為處理結果

  (2)預定義函數的調用

  技術分享

  (3)為什麽自定義函數預定義函數的調用形式完全不同?

    — makefile 中不支持真正意義上的自定義函數

    — 自定義函數的本質是多行變量

    — 預定義的 call 函數在調用時將參數傳遞給多行變量(call 的對象必須為多行變量,否則不起作用,不會傳遞參數)

    — 自定義函數是 call 函數的實參,並在 call 中被執行

 1 .PHONY : test
 2 
 3 define func1
 4     @echo "My name is $(0)"
 5 endef
 6 
 7 define func2
 8     @echo "My name is $(0)"
 9 endef
10 
11 var1 := $(call func1)
12 var2 := $(call func2)
13 var3 := $(abspath ./)
14 
15 test :
16     @echo "var1 => $(var1)"
17     @echo "var2 => $(var2)"
18     @echo "var3 => $(var3)"
19 
20 # 輸出結果
21 var1 =>     @echo My name is func1
22 var2 =>     @echo My name is func2
23 var3 => /home/swj/12-plan/makefile/lesson-9

註:本文整理於《狄泰12月提升計劃》課程內容

第9課 - 函數定義及調用