zoukankan      html  css  js  c++  java
  • 第九篇 函数调用

      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;">





  • 相关阅读:
    invalid byte 1 of 1-byte UTF-8 sequence
    MySQL的时间进位问题
    MyBatis返回主键
    No matching bean of type [xx] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency
    在eclipse中下载包含子模块(Submodules)的git项目
    ERWin & ERStudio图里的实线和虚线的含义[转]
    Win7玩游戏偶尔自动跳转到桌面的解决办法[转]
    SpringMVC静态资源处理[转]
    RocketMQ术语[转]
    手机收不到验证码
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/8418843.html
Copyright © 2011-2022 走看看