当前位置: 首页 > news >正文

第九部分 使用函数 (四)

目录

一、foreach 函数

二、if 函数

三、call 函数


一、foreach 函数

        foreach 函数和别的函数非常的不一样。因为这个函数是用来做循环用的,Makefile 中的 foreach 函数几乎是仿照于 Unix 标准 Shell(/bin/sh)中的 for 语句,或是 C-Shell (/bin/csh)中的 foreach 语句而构建的。它的语法是:

$(foreach <var>,<list>,<text>)

        这个函数的意思是,把参数<list>中的单词逐一取出放到参数<var>所指定的变量中, 然后再执行<text>所包含的表达式。每一次<text>会返回一个字符串,循环过程中, <text>的所返回的每个字符串会以空格分隔,最后当整个循环结束时,<text>所返回的每个字符串 所组成的整个字符串(以空格分隔)将会是 foreach 函数的返回值。

        所以,<var>最好是一个变量名,<list>可以是一个表达式,而<text>中一般会使用<var> 这个参数来依次枚举<list>中的单词。举个例子:

names := a b c d

files := $(foreach n,$(names),$(n).o)

        上面的例子中,$(name)中的单词会被挨个取出,并存到变量“n”中,“$(n).o”每次 根据“$(n)”计算出一个值,这些值以空格分隔,最后作为 foreach 函数的返回,所以, $(files)的值是“a.o b.o c.o d.o”。

        注意,foreach 中的<var>参数是一个临时的局部变量,foreach 函数执行完后,参数<var> 的变量将不在作用,其作用域只在 foreach 函数当中。

二、if 函数

        if 函数很像 GNU 的 make 所支持的条件语句——ifeq(参见前面所述的章节),if 函数 的语法是:

$(if <condition>,<then-part>)

或是

$(if <condition>,<then-part>,<else-part>)

        可见,if 函数可以包含“else”部分,或是不含。即 if 函数的参数可以是两个,也可 以是三个。<condition>参数是 if 的表达式,如果其返回的为非空字符串,那么这个表达式 就相当于返回真,于是,<then-part>会被计算,否则<else-part>会被计算。

        而 if 函数的返回值是,如果(condition)为真(非空字符串),那个<then-part>会是整 个函数的返回值,如果<condition>为假(空字符串),那么<else-part>会是整个函数的返 回值,此时如果没有被定义,那么,整个函数返回空字串。

        所以,<then-part>和<else-part>只会有一个被计算。

三、call 函数

        call 函数是唯一一个可以用来创建新的参数化的函数。你可以写一个非常复杂的表达 式,这个表达式中,你可以定义许多参数,然后你可以用 call 函数来向这个表达式传递参 数。其语法是:

$(call <expression>,<pram1>,<pram2>,<pram3>...)

        当 make 执行这个函数时,参数中的变量,如$(1),$(2),$(3)等,会被 参数,,依次取代。而的返回值就是 call 函数的返回 值。例如:

reverse = $(1) $(2)

foo = $(call reverse,a,b)

        那么,foo 的值就是“a b”。当然,参数的次序是可以自定义的,不一定是顺序的,

如:

reverse = $(2) $(1)

foo = $(call reverse,a,b)

此时的 foo 的值就是“b a”。

http://www.lryc.cn/news/280740.html

相关文章:

  • 一文读懂「Prompt Engineering」提示词工程
  • 微信小程序(一)简单的结构及样式演示
  • 【设计模式】外观模式
  • 优先级队列(Priority Queue)
  • 12-桥接模式(Bridge)
  • Zookeeper+Kafka概述
  • 架构师 - 架构师是做什么的 - 学习总结
  • 全链路压测方案(一)—方案调研
  • c++关键字const
  • 分布式计算平台 Hadoop 简介
  • 系统学习Python——警告信息的控制模块warnings:常见函数-[warnings.warn]
  • 监听键盘事件vue3封装hooks
  • Java Stream简化代码
  • py爬虫入门笔记(request.get的使用)
  • openssl3.2 - 官方demo学习 - encode - rsa_encode.c
  • Day03
  • adb 常用命令汇总
  • ubuntu 2022.04 安装vcs2018和verdi2018
  • 品牌推广与情绪价值的深度结合:市场大局下的新趋势与“准”原则
  • React16源码: React中的不同的expirationTime的源码实现
  • TRB 2024论文分享:基于生成对抗网络和Transformer模型的交通事件检测混合模型
  • Golang 打包
  • 力扣每日一练(24-1-14)
  • K 个一组翻转链表(链表反转,固定长度反转)(困难)
  • Spring Boot - 利用Resilience4j-RateLimiter进行流量控制和服务降级
  • 概率论与数理统计————1.随机事件与概率
  • 【生存技能】git操作
  • docker 将镜像打包为 tar 包
  • 341. 最优贸易(dp思想运用,spfa,最短路)
  • FineBI实战项目一(19):每小时订单笔数分析开发