函数定义及调用(八)

在 makefile 中是支持函数的概念的,make 解释器提供了一系列的函数供 makefile 调用。在 makefile 中支持自定义函数实现,并调用执行;提供 define 关键字实现自定义函数。下面是自定义函数的语法

我们再来深入地看看自定义函数,自定义函数是一个多行变量,无法直接调用;其次自定义函数是一种过程调用,没有任何的返回值;自定义函数用于定义命令集合,并应用规则中。下来我们还是以代码为例来进行说明

.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

var := $(call func1)
new := $(func1)

test :
    @echo "new => $(new)"
    @echo "var => $(var)"
    $(call func1) #@echo My name is func1
    $(call func2, D.T.Software, delphi_tang)

我们来看看编译结果

我们看到 new 变量只打印了前面的,并么有打印 func1,因为自定义函数其本质是过程调用,没有任何的返回值;而 var 前面加了 call,因此它会输出函数名 func1。在直接进行 call func1 时,打印便是定义的字符串,它的参数 0 是函数名;call func2 时,加了两个参数,因此参数 1 为 D.T.Software,参数 2 为 delphi_tang。下来我们来看看预定义函数的调用,格式如下

那么自定义函数和预定义函数的调用形式为何完全不同呢?我们来分析下 makefile 中的预定义函数,其实在 makefile 中是不支持真正意义上的自定义函数的,自定义函数的本质是多行变量;预定义的 call 函数在调用时将参数传递给多行变量,自定义函数是 call 函数的实参,并在 call 中被执行。

下来我们还是以代码为例来进行说明

.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)"

程序中的 abspath 是输出当前目录的绝对路径,我们来看看结果

我们看到 var1 和 var2 定义的分别是个自定义函数,因此输出函数名;而 var3 是输出当前目录的绝对路径,var4 是输出当前目录下的 test.cpp 路径。结果也正是这样的。通过对 makefile 中的函数定义及调用的学习,总结如下:1、make 解释器提供了一系列的函数供 makefile 调用;2、自定义函数是一个多行变量,无法直接调用;3、自定义函数用于定义命令集合,并应用于规则中;4、预定义的 call 函数在调用时将参数传递给多行变量;5、自定义函数是 call 函数的实参,并在 call 中被执行。

欢迎大家一起来学习 makefile 语言,可以加我QQ:243343083。

原文地址:http://blog.51cto.com/12810168/2130033

时间: 2024-08-05 03:18:54

函数定义及调用(八)的相关文章

实验八——函数定义及调用总结

实验八--函数定义及调用总结 1.本次课学习到的知识点: (1)void为不反回结果的函数,且void不能省略,否则默认为int,函数体中没有表达式的return语句,也可省略return. (2)不返回结果的函数在定义.调用.参数传递.函数声明上,思路与以前相同,适用于把一些确定的.相对独立的程序功能封装成函数. (3)局部变量:定义在函数的内部,且有效作用范局部变量一般定义在函数或复合语句的开始处,围局限于所在的函数内部,形参是局部变量. (4)不能定义在中间位置. (5)全局变量:定义在函

第9课 - 函数定义及调用

第9课 - 函数定义及调用 1. makefile中的函数 (1)make 解释器提供了一系列的函数供 makefile 调用 (2)在 makefile 中支持自定义函数实现,并调用执行 (3)通过 define 关键字实现自定义函数 2. 在makefile中自定义函数 (1)自定义函数的语法 其中,$(0) 代表被调用的函数名,$(1) , $(2) , $(3) ... 代表调用函数时后面的传参 (2)深入理解自定义函数 - 自定义函数是一个多行变量,无法直接调用 - 自定义函数是一种过

函数 定义与调用

为什么要用函数 函数的定义与调用 函数的返回值 函数的参数 本章小结 返回顶部 为什么要用函数 现在python届发生了一个大事件,len方法突然不能直接用了... 然后现在有一个需求,让你计算'hello world'的长度,你怎么计算? 这个需求对于现在的你其实不难,我们一起来写一下. s1 = "hello world" length = 0 for i in s1: length = length+1 print(length) 好了,功能实现了,非常完美.然后现在又有了一个需

make--变量 条件判断 函数定义及调用

一.变量的高级主题 A.变量值的替换1.使用指定字符(串)替换变量中的后缀字符(串)2.语法格式:$(var:a=b) (将a替换成b)a.替换表达式中不能有任何的空格b.make中支持使用${}对变量进行取值示例 src:=a.cc b.cc c.cc obj:=$(src:cc=o) test: @echo "obj=>$(obj)" 输出结果由上图可以看出变量值的替换B.变量的模式替换1.使用%保留变量值中的指定字符,替换其它字符2.语法格式:$(var:a%b=x%y)a

python 函数定义和调用

一.python 函数的分类: 1.内置函数 2.标准库函数 3.第三方函数 4.用户自定义函数 函数定义和调用 在使用函数之前必须先定义函数,执行def时,会创建一个函数对象并绑定到函数名变量上,定义函数的语法格式如下: def 函数名(形参列表):    //由零条到多条可执行语句组成的函数    [return [返回值]] 示例: 二.返回值: return 返回值要点: 1.如果函数体中包含return 语句,则结束函数执行并返回值: 2.如果函数体中包含return语句,则返回Non

实验八--函数定义及调用总结

本次课学习到的知识点: 函数分成库函数和定义函数两种,库函数在编程是可以直接调用,定义函数需要自己定义,他们也有共同的特点就是能实现一个运算,并且得到一个明确的计算结果. 函数首部由函数类型,函数名和形式参数组成,位于函数定义的第一行,形参用于给出函数计算所要的函数结果和返回类型,形参表中各个形参用逗号分隔. 实际参数可以是常量,变量,表达式.形参必须是变量. 形参和实参必须一一对应,由实参一一传递给形参. 试验中遇到的问题及解决办法: 在金字塔的实验中进入了死循环,最后发现没有添加scanf语

实验八—函数定义及调用总结

一.本次课学习到的知识点: 1.学习了数字金字塔例题,pyramid ()函数功能,函数定义时,形参n决定数字金字塔的层数: 2.复数运算: c1=x1+(y1) i,c2=x2+(y2)i; c1+c2=(x1+x2)+(y1+y2)i; c1*c2=(x1*x2-y1*y2)+(x1*y2+x2*y1)i; 3.自动变量定义形式:auto 类型名 变量表: 静态变量定义格式:static 类型名 变量表:(静态变量只能用于所定义的函数,而全局变量用于所有函数. 二.实验过程中遇到的问题及解决

Bash脚本之函数定义和调用

把那些在脚本中重复出现并且没有任何改变的代码,封装起来,在适当的场景中调用执行.程序员将这种被封装起来的代码称为功能体,或者叫模块,也称为函数.这样看来是不是和循环类似,循环也是为了方便去多次执行一堆代码,而函数是将一堆代码写在一起,起一个名字,然后在需要这堆代码的时候只需要写上函数的名字即可.在shell脚本编程中,函数是由若干条shell命令组成的语句块,函数里面的内容和shell程序形式上是一致的.不同之处就是,shell代码可以直接被执行,而函数中的内容,不能独立执行,只有被调用的时候才

实验七——函数定义及调用总结

1.本次课学习到的知识点: 函数 (1)定义:函数是一个完成特定工作的独立程序模块,包括函数和自定义函数两种: 1.scanf(),printf()等为库函数,由c语言系统提供定义,编程时只要直接调用即可. 2. cylinder(),fact()函数,需要用户自己定义,为自定义函数. (2)cylinder(),fact()功能不同,但他们能实现一个计算,并可以得到一个明确的计算结果. (3) 函数定义的一般形式为: 函数类型    函数名(形式参数表) { 函数实现过程 } (4)函数部首: