变量高级用法

简介: 变量高级用法

变量值的替换

我们可以替换变量中的共有的部分,其格式是 $(var:a=b) 或是 ${var:a=b} ,其意思是,把变量 var 中所有以 a 字串 结尾a 替换成 b 字串。这里的 结尾 意思是 空格 或是 结束符


还是看一个示例吧:

foo := a.o b.o c.o
bar := $(foo:.o=.c)点击复制复制失败已复制


这个示例中,我们先定义了一个 $(foo) 变量,而第二行的意思是把 $(foo) 中所有以 .o 字串结尾全部替换成 .c ,所以我们的 $(bar) 的值就是 a.c b.c c.c


另外一种变量替换的技术是以静态模式定义的,如:

foo := a.o b.o c.o
bar := $(foo:%.o=%.c)点击复制复制失败已复制


这依赖于被替换字串中的有相同的模式,模式中必须包含一个 % 字符,这个例子同样让 $(bar) 变量的值为 a.c b.c c.c


把变量的值再当成变量

先看一个例子:

x = y
y = z
a := $($(x))点击复制复制失败已复制


在这个例子中, $(x) 的值是 y ,所以 $($(x)) 就是 $(y) ,于是 $(a) 的值就是 z


注意

x=y ,而不是 x=$(y)


我们还可以使用更多的层次:

x = y
y = z
z = u
a := $($($(x)))点击复制复制失败已复制


这里的 $(a) 的值是 u


让我们再复杂一点,使用上在变量定义中使用变量的第一个方式,来看一个例子:

x = $(y)
y = z
z = Hello
a := $($(x))点击复制复制失败已复制


这里的 $($(x)) 被替换成了 $($(y)) ,因为 $(y) 值是 z ,所以,最终结果是: a:=$(z) ,也就是 Hello


再复杂一点,我们再加上函数:

x = variable1
variable2 := Hello
y = $(subst 1,2,$(x))
z = y
a := $($($(z)))点击复制复制失败已复制


这个例子中, $($($(z))) 扩展为 $($(y)) ,而其再次被扩展为 $($(subst 1,2,$(x)))$(x) 的值是 variable1subst 函数把 variable1 中的所有 1 字串替换成 2 字串,于是, variable1 变成 variable2 ,再取其值,所以,最终, $(a) 的值就是 $(variable2) 的值—— Hello 。(喔,好不容易)

在这种方式中,可以使用多个变量来组成一个变量的名字,然后再取其值:

first_second = Hello
a = first
b = second
all = $($a_$b)点击复制复制失败已复制


这里的 $a_$b 组成了 first_second ,于是, $(all) 的值就是 Hello


再来看看结合第一种技术的例子:

a_objects := a.o b.o c.o
1_objects := 1.o 2.o 3.o
sources := $($(a1)_objects:.o=.c)点击复制复制失败已复制


这个例子中,如果 $(a1) 的值是 a 的话,那么, $(sources) 的值就是 a.c b.c c.c ;如果 $(a1) 的值是 1 ,那么 $(sources) 的值是 1.c 2.c 3.c


再来看一个这种技术和函数条件语句一同使用的例子:

ifdef do_sort
    func := sort
else
    func := strip
endif
bar := a d b g q c
foo := $($(func) $(bar))点击复制复制失败已复制


这个示例中,如果定义了 do_sort ,那么: foo := $(sort a d b g q c) ,于是 $(foo) 的值就是 a b c d g q ,而如果没有定义 do_sort ,那么: foo := $(strip a d b g q c) ,调用的就是 strip 函数。


当然,把变量的值再当成变量这种技术,同样可以用在操作符的左边:

dir = foo
$(dir)_sources := $(wildcard $(dir)/*.c)
define $(dir)_print
lpr $($(dir)_sources)
endef点击复制复制失败已复制


这个例子中定义了三个变量: dirfoo_sourcesfoo_print

目录
相关文章
|
网络协议 Linux iOS开发
【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
【100天精通python】Day40:GUI界面编程_PyQt 从入门到实战(完)_网络编程与打包发布
374 0
|
缓存 NoSQL Redis
蓝易云 - 如何使用Redis来防止穿透、击穿和雪崩问题
1. 缓存雪崩:缓存雪崩是指缓存中的大部分数据同时失效,导致短时间内大量的请求直接打到数据库上。防止缓存雪崩的方法是,给每一个key设置一个随机的过期时间,这样可以保证不会有大量的key同时失效。
189 1
|
10月前
|
Kotlin
Kotlin - 参数与异常
Kotlin - 参数与异常
77 5
|
JavaScript 前端开发 算法
JavaScript 中前置自增与后置自增:区别、应用场景
【4月更文挑战第6天】JavaScript中的前置自增`++a`先增后用,返回新值,适合复合赋值和循环计数;后置自增`a++`先用后增,返回原值,适用于保留变量原值的操作。二者差异在于运算时机和返回值,选择时要考虑递增时机和表达式中使用的值。在复杂表达式中应避免混用,注重代码清晰度和一致性。理解这些差异能提高代码效率,避免逻辑错误。
653 1
|
Oracle Java 关系型数据库
想要造轮子,你知道反射机制吗?
平时写代码的过程中,我们使用不同的工具框架来提升开发效率,除了基础框架之外,我们自己也想造轮子,封装各种业务平台功能; 一旦需造轮子的时候,那么就需要使用Java造轮子利器:反射; 一些项目中常见的反射应用场景: • 泛化调用: 提前不知道目标RPC的接口和方法,而是开发在后台输入值,根据输入的配置动态请求。 这也是提升效率的一部分,因为不可能所以得RPC接口都要亲自对接的,总要有一部分可以灵活的调用不同接口。
164 0
|
机器学习/深度学习 算法 数据挖掘
逻辑回归的原理、Python的实现方式
逻辑回归的原理、Python的实现方式
439 0
|
测试技术 Docker Python
《Docker 简易速速上手小册》第9章 Docker 与持续集成(2024 最新版)
《Docker 简易速速上手小册》第9章 Docker 与持续集成(2024 最新版)
115 0
|
存储 DataX C语言
数据结构——单链表
数据结构——单链表
|
XML Java Android开发
Android动画 补间动画
补间动画:属于Android中View动画的一种,就是涵盖了 平移、缩放、旋转 和 透明度四种变化的动画。实现方式有两种:xml文件 和 java代码。 四种补间动画分别为RotateAnimation、ScaleAnimation、TranslateAnimation、AlphaAnimation,他们的父类为Animation。