玖 -《函数定义及调用》
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)
做的两件事
- 替换参数
$(0)
替换成 func1 - 将当行变量间接替换到调用的中央失去
my name is func1
define 用于定义多行变量的,只不过这个多行变量能够在 call 的作用下当作自定函数应用,这个应用有限度,必须在规定中应用。
因而对于 var := $(call func1)
这样写是不会启动函数调用的后果的,仅仅把它 func1 当作变量解决了
new 的值没有函数名,阐明 call 的作用将实参值替换到对应的地位下来,这里就是 $(0)
make 解释器中的预约义函数
- make 的函数提供了解决文件名,变量和命令的函数 ( 相当于库函数)
- 能够在须要的中央调用函数来解决指定的参数
- 函数在调用的中央被替换为处理结果
- 预约义函数是有返回值的!!!
预约义函数的调用
var := $(abspath ./)
test :
@echo "var => $(var)"
问题
为什么自定义函数和预约义函数的调用模式齐全不同?
实质分析
- 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 解决的领域
编程试验 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 中真正意义上的函数调用都只能是预约义的函数调用,而自定义的函数调用在实质上是不存在的,仅仅是模仿上的行为
小结
- make 解释器提供了一些列的函数供 makefile 调用
- 自定义函数是一个多行变量,无奈间接调用
- 自定义函数用于定义命令汇合,并利用与规定中
- 预约义的 call 函数在调用时将参数传递给多行变量
- 自定函数是 call 函数的实参,并在 call 中被执行