zoukankan      html  css  js  c++  java
  • makefile之call函数

    call函数是唯一一个可以创建定制化参数函数的引用函数。
    支持对自定义函数的引用;
    支持将一个变量定义为一个复杂的表达式,用call函数根据不同的参数对它进行展开来获取不同的结果;

    函数语法:
    $(call VARIABLE,PARAM,PARAM,...)

    函数功能:
    在执行时,将它的参数"PARAM"依次赋给临时变量"$(1)","$(2)".call对参数的数目没有限制,也可以没有参数值。
    最后再对VARIABLE展开后的表达式进行处理.
    函数返回值:
    VARIABLE展开后的表达式的值
    函数说明:
    1. 变量VARIABLE在定义时最好定义为递归展开式;
    2. call函数中对VARIABLE的调用,直接给函数或变量名就好了,不要用"$";
    3. 多个PARAM使用逗号分割开,且逗号和PARAM之间不能有空格,否则会导致解析异常;(PS:我自己在这个挖过坑,因为习惯c编码时,在逗号后面加一个空格)

    1. 变量的引用

    1.1 变量定义为直接展开式

    如果这里将VARIABLE1定义为直接展开式,最终调用call函数后,返回值为空
    我的理解是,直接展开式在定义时将((1)和)(2)展开,而此时它们的值为空,所以变量的值为空.当执行到call函数时,尽管带上了需要传递的参数,但PARAM(((1)和)(2))之前已经被展开了,故此时已经取不到传递进来的参数值.

    VARIABLE1 := $(2) $(1)
    
    $(info 1-$(VARIABLE1))
    
    aa=$(call VARIABLE1,hello,world)
    
    $(info 1-$(aa))
    all:
    	@echo Done
    

    1.2 变量定义为递归展开式

    VARIABLE1 = $(2) $(1)
    
    $(info 2-$(VARIABLE1))
    
    aa=$(call VARIABLE1,hello,world)
    
    $(info 2-$(aa))
    all:
    	@echo Done
    

    这里变量类型的定义再罗嗦一下,所谓的直接展开式,即在定义的时候立即展开;递归展开式,在定义的时候其实相当于声明,只有在实际引用时才展开.

    2. 函数的引用

    2.1 不带参数的函数引用

    define FUNC1
    $(info echo 3-"hello")
    endef
    $(call FUNC1)
    all:
    	@echo Done
    

    2.2 带参数的函数引用

    define FUNC1
    $(info echo 4-$(1) $(2))
    endef
    
    $(call FUNC1,hello,wolrd)
    
    all:
    	@echo Done
    

    2.3 逗号和参数之间有空格的示例

    define FUNC1
    $(info echo 5-$(1) $(2))
    endef
    
    $(call FUNC1, hello, wolrd)
    
    all:
    	@echo Done
    

    从执行的结果会发现,逗号和参数之间的空格也被作为参数的一部分.在这个例子中可能看不出明显的负面影响,后面我在举个栗子.

  • 相关阅读:
    Alpha项目冲刺_博客链接合集
    项目系统设计
    项目需求分析
    项目选题
    项目展示
    原型设计 + 用户规格说明书
    测试与优化
    结对作业1
    MathExam6317
    js入门基础
  • 原文地址:https://www.cnblogs.com/black-mamba/p/9660226.html
Copyright © 2011-2022 走看看