玖-《函數定義及調用》

玖-《函數定義及調用》

makefile 中支持函數的概念

  • make 解釋器提供一系列的函數供 makefile 調用
  • 在makefile 中支持自定義函數實現,並調用執行
  • 經過 define 關鍵字實現自定義函數

自定義函數語法

  • 函數定義
define func1
    @echo "my name is $(0)"
endef  

define func2
    @echo "my name is $(0)"
    @echo "Param => $(1)"

endef
  • 函數調用
test :
    $(call func1)
    $(call func2, Kevin)

深刻理解自定義函數

  • 自定義函數是一個多行變量,沒法直接調用
  • 自定義函數是一種過程調用,沒有任何的返回值(和C編程思想是不一樣)
  • 自定義函數用於自定義命令集合,並應用於規則中

編程實驗1

.PHONY : test  

define func1
    @echo "my name is $(0)"
endef

define func2
    @echo "my name is $(0)"
    @echo "Param 1 => $(1)"
    @echo "Param 2 => $(2)"
endef

# 調用 func1 ,返回值賦值給 var
# 結果確是 fun1 多行變量的值
var := $(call func1)
new := $(func1)

test :
    @echo "var => $(var)"
    @echo "new => $(new)"
    $(call func1)
    # call 關鍵字調用函數
    $(call func2,kevin,666)
    # func2 裏面給參數在上面給出
book@www.100ask.org:/mnt/hgfs/100ask$ make
var =>  @echo my name is func1
new =>  @echo my name is
my name is func1
my name is func2
Param 1 => kevin
Param 2 => 666

小結論

$(call func1) 作的兩件事編程

  1. 替換參數 $(0) 替換成 func1
  2. 將當行變量直接替換到調用的地方獲得my name is func1

define 用於定義多行變量的,只不過這個多行變量能夠在 call 的做用下看成自定函數使用,這個使用有限制,必須在規則中使用。
所以對於 var := $(call func1) 這樣寫是不會啓動函數調用的結果的,僅僅把它func1 看成變量處理了 ubuntu

new 的值沒有函數名,說明 call 的做用將實參值替換到對應的位置上去,這裏就是 $(0)函數

make 解釋器中的預約義函數

  • make 的函數提供了處理文件名,變量和命令的函數(至關於庫函數)
  • 能夠在須要的地方調用函數來處理指定的參數
  • 函數在調用的地方被替換爲處理結果
  • 預約義函數是有返回值的!!!

預約義函數的調用

圖片.png

var := $(abspath ./)

test :
    @echo "var => $(var)"

問題

爲何自定義函數和預約義函數的調用形式徹底不一樣?spa

本質剖析

  • makefile 中不支持真正意義上的自定義函數
  • 自定義函數的本質是對行變量
  • 預約義的 call 函數在調用時將參數傳遞給多行變量
  • 自定義函數是 call 函數的實參,並在 call 中被執行

編程實驗2.1

.PHONY : test 

define func1
    @echo "my name is $(0)"
endef  

func2 := @echo "my name is $(0)"

test :
    $(call func1)
    $(call func2)
zhabin666@ubuntu:/mnt/hgfs/Fileshare_LinuxC$ make
my name is func1
my name is

func2 不是 call 處理的範疇code

編程實驗2.2

.PHONY : test

define func1
    @echo "My name is $(0)"
endef

define func2
    @echo "My name is $(0)"
endef

var1 := $(call func1)
var2 := $(call func2)
var3 := $(abspath ./)
var4 := $(abspath test.cpp)

test :
    @echo "var1 => $(var1)"
    @echo "var2 => $(var2)"
    @echo "var3 => $(var3)"
    @echo "var4 => $(var4)"

makefile 中真正意義上的函數調用都只能是預約義的函數調用,而自定義的函數調用在本質上是不存在的,僅僅是模擬上的行爲blog

小結

  • make 解釋器提供了一些列的函數供 makefile 調用
  • 自定義函數是一個多行變量,沒法直接調用
  • 自定義函數用於定義命令集合,並應用與規則中
  • 預約義的 call 函數在調用時將參數傳遞給多行變量
  • 自定函數是 call 函數的實參,並在 call 中被執行
相關文章
相關標籤/搜索