第九篇 函数调用

  makefile中支持函数的概念,make解释器提供了一系列的函数供makefile调用,类似于函数库。在makefile中支持自定义函数的实现,并调用执行。通过define关键字实现自定义函数。
 自定义函数的基本语法如下:
 
  自定义函数是一个多行变量,无法直接调用,只能在规则中进行调用。自定义函数是一种过程调用,没有任何的返回值,自定义函数用于定于命令集合,并应用于规则中。
  编写makefile如下:
 
 执行make,输出结果如下:
 
   define定义的多行变量在call的作用下可以起到自定义函数的作用,但是这个使用是有限制的,必须在规则中使用,即19、20行那样的使用方式。
   第13行的var:=$(call func1)无法起到函数调用的作用,call只是将func1当作一个多行变量来处理,将实参进行了相应替换,因此,输出var => @echo My name is func1,$(0)被替换成了func1。由此,我们也可以得出大概的结论,call函数负责将实参依次替换到函数体的相应位置上。在14行的new变量的赋值上,没有调用call函数,而只是取func1这个变量的值,因此,这个变量值中的$(0)为空。
   再次强调,define只是定义了多行变量,在call函数的作用下将实参替换到对应的位置上去。因此,自定义函数只能用来定义命令集合,并且只能用于规则中也就不难理解了。
   上图中第19行实际做的事分为以下两步:1、替换参数,替换后得到@echo My name is func1;2、将得到的@echo My name is func1这个多行变量直接替换19行,即19行变成了@echo My name is func1。
 
  make解释器中还提供了预定义函数:make的函数提供了处理文件名、变量和命令的函数。可以在需要的地方调用函数来处理指定的参数。函数在调用的地方被替换为处理结果。
  预定义函数的调用语法如下:
 
 我们可以看到预定义函数和自定义函数的调用形式完全不同,为什么会出现这种情况呢?原因如下所示:
 
 自定义函数是预定义函数call的实参,并且在call中被执行,也即进行参数替换。
 
再次修改makefile并执行make,结果如下所示:
 
可见,调用func2时,$(0)并没有被替换成func2,而是成为了空值,因为这里的func2就是一个普通变量而非一个多行变量,不能被正常处理,所以参数替换没有发生。
再次给出以下程序和执行结果以加深印象:
 
结合前述的分析可知,以上的执行结果是毫无疑问的。
 
参考如下:
    狄泰软件教程与课件
    GUN make手册
    专业嵌入式软件开发
 
 
 
 
 
 
 
 
 

<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">





原文地址:https://www.cnblogs.com/wanmeishenghuo/p/8418843.html