时间是我们唯一拥有的东西了,利用时间,发挥光芒。——张顺
什么是赋值
常见赋值:(实例1.1)
#include <stdio.h>
int main()
{
int a,b; //定义一个变量a和b
a = 10; //将变量a赋值为10
b = 20; //将变量b赋值20
a = b; //再将b的值赋值a
printf("%d\n",a); //打印变量a
return 0;
}
结果是20。
这是c语言中简单的赋值,但是在Makefile中如何实现赋值呢,他赋值还是使用的“=”号吗,还是有其他的更多的符号提供使用。一起进入这“该死”的Makefile中学习吧
Makefile当中的赋值
赋值符号
Makefile当中的赋值符号:
= 延时变量,只有被使用时才展开定义
:= 立即变量,定义时的赋值立即有效
?= 条件变量,当变量为空时才赋值
+= 追加赋值,将一个变量的值追加到另一个变量的后面
=延时赋值(不要觉得简单就跳过,和你平时学的不一样)
核心概念:只有被使用时才展开定义
A=123 #将123“延时赋值”给A
B=$(A) #将A的值“延时赋值”给B
print:
@echo $(B) #打印B
依次剖析上面几句的意思:
上面是“=”符号的单独使用,注意第一句A=123
此时并没有真正意义的赋值给A,什么时候才真正给A赋值了呢?那就是使用变量A的时候才真正进行了意义上的赋值 。
那么接着看第二句B=$(A)
,在第二句当中,也是一个延时赋值给B
,这就导致$(A)
看起来是被使用了其实并没有被使用,他在等待B
真正赋值的时候才会使用A
,于是乎B
也在等待被使用,什么时候才使用,也就是下面的@echo $(B)
语句。
这条语句导致打印B
里面的值,致使B
被使用 ,那么此时第二条语句延时赋值的条件达成就变成了真正意义的赋值,致使A
变量被使用,又回到第一句进行真正意义的赋值,这就是你为什么可以在输出结果可以看到是123
没想到吧,一个从开始学编程的等于号都这么绕,成热打铁
加大难度来一次练习题:(可以先不看结果,猜一猜结果是什么)
A=123 #将123赋值给A
B=$(A) #将A的值给B
A=456
C=$(A)
print:
@echo "B="$(B) #打印B
@echo "C="$(C) #打印C
答案(下面字体为白色,选中可以查看答案):
最后出输:
B=456
C=456
猜对了吗?
小贴士:事实上延时赋值也是取得最后一次赋值,也就是延时赋值也会被覆盖,新的会把旧的给干掉,无论在哪里只要我是新的。
:=立即赋值
核心概念:定义时的赋值立即有效
立即赋值?这次怎么觉得立即赋值这几个字有点舒服呢。肯定不用像第一个延时赋值那样麻烦,哈哈,没错他就是咱们普通学习的赋值这里只是样子被改变了。
将上一道练习题直接改变符号,看看结果:
A:=123 #将123赋值给A
B:=$(A) #将A的值给B
A:=456
C:=$(A)
print:
@echo "B="$(B) #打印B
@echo "C="$(C) #打印C
结果:
显而易见不是吗
?=条件赋值
核心概念:当变量为空时才赋值
看字面意思应该是带点判断的感觉,马上实操看看情况。
以下实例:
B?=123
B?=456
C?=$(B)
print:
@echo "B="$(B) #打印B
@echo "C="$(C) #打印C
输出结果为:
B=123
C=123
结合概念,我想也很容易理解,还是稍作解释
第一句由于第一次给B赋值,理所当然赋值成功,第二句,变量B由于第一次的赋值已经不是空,所以根据概念,当变量为空才进行赋值,第二次赋值忽略,所以导致输出为123,而不是456.
+=追加赋值
核心概念:将一个变量的值追加到另一个变量的后面
追加赋值通常用于字符串
# 定义一个空变量
VAR :=
# 将字符串追加到变量VAR后面
VAR += Hello
# 将另一个字符串追加到变量VAR后面
VAR += World
# 打印变量VAR的值
echo $(VAR)
输出结果为:
HelloWorld
在这个例子中,我们首先定义了一个空变量VAR。然后,我们使用VAR += Hello将字符串Hello追加到VAR的末尾。接下来,我们使用相同的语法将另一个字符串World追加到VAR的末尾。最后,我们使用echo命令打印变量VAR的值,得到了追加后的字符串HelloWorld。
结束
持续更新中……,有问题随时发表评论,一起讨论解决。