变量高级用法

简介: 变量高级用法

变量值的替换

我们可以替换变量中的共有的部分,其格式是 $(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

目录
相关文章
|
9月前
ThreadHelper用法
ThreadHelper用法
51 0
|
API Windows
CreateEvent的用法
事件对象就像一个开关:它只有两种状态---开和关。当一个事件处于”开”状态,我们称其为”有信号”否则称为”无信号”。可以在一个线程的执行函数中创建一个事件对象,然后观察它的状态,如果是”无信号”就让该线程睡眠,这样该线程占用的CPU时间就比较少。
1016 0
|
Java
java定时器的几种用法[转]
 1 import java.util.Calendar;   2 import java.util.Date;   3 import java.util.Timer;   4 import java.
934 0
CComPtr用法
<p>COM接口指针很危险,因为使用过程中需要每一个使用者都要严格并且正确的AddRef和Release,一旦出现问题,就会造成对象不能被正常释放,或者对象被重复删除,造成程序崩溃。所以使用COM接口,必须小心翼翼才行。<br> 但是,即使所有的代码中,都正确的AddRef和Release,也不一定能保证万无一失,例如:<br> void SomeApp( IHello * pHell
1882 0
PRId64的正确用法
#include #include #include // g++ -g -o x x.cpp -D__STDC_FORMAT_MACROS -std=c++11 int main() {         int64_t a = 32;         //pri...
1291 0

热门文章

最新文章