玖-《函数定义及调用》

玖-《函数定义及调用》

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 当作变量处理了

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 中被执行
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值