打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Make文件中赋值等号的几种类型(:=,?=,=)
今天有一位以前仅做过Android APP开发的同学突然间问我,说Makefile中经常可以看见:冒号等号(:=)、问号等号(?=)和直接等号(=)。这究竟有什么区别呢?
欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu

突然想到团队中其实有些同学以前没有做过Android整个源码树或者native代码的修改和开发,因此对Makefile有些陌生。这里简单的介绍一下三者的区别,其实非常简单:

1) ?=: 条件赋值(conditional variable assignment),如果变量已经赋值,则不要重新赋值;
2) :=: 立即赋值(immediately assignment),变量取值立即展开;
3) =: 递归展开赋值(recursively expanded assignment),该变量在使用的时候才对表达式进行展开;

对于后面的2)、3),稍微难以理解一点,但是只要我给出下面的表达式大家立即就会理解了:
VAR1 = $VAR2 + postfix
对头,区别就是如果变量的表达式中包含另外的变量如何处理。立即赋值立刻取值展开,以后VAR1和VAR2就没有关系了;递归展开赋值在后面使用VAR1的时候才真正根据VAR2的取值来计算,
如果期间VAR2的取值发生变换,VAR1的取值也是变化的。

下面看几个例子加深理解:
欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu
1. ?= 
这个非常简单,就是说符号已经定义,就不要进行赋值。

  1. P = hello  
  2. P ?= byebye  
  3. TARGET:  
  4.         @echo $(P)  


$ make
hello
这里看出,P并没有赋值为byebye,因为它已经有值了。

2. := 和 = 赋值
这两个赋值的区别在于如果表达式中包含其他的变量,那其他变量展开的时机。
:= 在赋值的时候就展开,以后不再变化;
= 在使用的时候展开,如果赋值和使用之间右部变量发生改变,则取值发生变化;

  1. <pre name="code" class="plain">P = hello  
  2. A := $(P)  
  3. B = $(P)  
  4. P = byebye  
  5. TARGET:  
  6.         @echo $(A)  
  7.         @echo $(B)  

$ make
hello
byebye


这里看出,P取值发生改变后,A的取之并没有重新eval,而B在使用的时候,使用的是最新的P。

为了便于喜欢研究的同学深究,我特意上传makefile的宝典pdf文件供大家下载:

欢迎转载,但是请注明原出处:http://blog.csdn.net/howellzhu

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
JavaScript 学习-7.函数定义的几种方式
轻松学习 JavaScript——第 1 部分:了解 let 语句
几分钟内学会Kotlin语言
JavaScript 變數宣告 | kpman | code
shell脚本对变量迭代求值,二次求值
jquery原理的简单分析,扒开jquery的小外套
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服