千家信息网

变量和不同的赋值方式(四)

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,在 makefile 中是支持程序设计语言中变量的概念的,makefile 中的变量只代表文本数据(字符串)。那么在 makefile 中的变量名的规则又有哪些呢?a> 变量名可以包含字符、数字以及下
千家信息网最后更新 2026年10月31日变量和不同的赋值方式(四)

在 makefile 中是支持程序设计语言中变量的概念的,makefile 中的变量只代表文本数据(字符串)。那么在 makefile 中的变量名的规则又有哪些呢?a> 变量名可以包含字符、数字以及下划线;b> 不能包含 ":" , "#" , "=" 或 " ";c> 变量名大小写敏感。下来我们来看看变量的定义和使用,如下

下来我们以代码为例来进行分析说明

CC := gccTARGET := hello.out$(TARGET) : func.o main.o    $(CC) -o $(TARGET) func.o main.ofunc.o : func.c     $(CC) -o func.o -c func.cmain.o : main.c    $(CC) -o main.o -c main.c.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)    clean :     rm *.o $(TARGET)

我们来看看编译结果是否和之前一样

效果和之前是一样的,那么我们为何这样定义变量呢?在一些大型的工程项目中,我们可能要编译好几个版本,因此定义不同的 TARGET 便会编译出不同的版本。而且这种方法还有个好处就是编译器可以由我们自定义选择,比如我们将上面的 gcc 编译器换成 g++,则只需将 CC := gcc 换成 CC := g++,下来我们来看看编译效果

我们看到编译器已经换为 g++ 了。下来我们来讲讲 makefile 中变量的赋值方式,分为四种:a> 简单赋值(:=);b> 递归赋值(=);c> 条件赋值(?=);d> 追加赋值(+=)。那么不同的赋值方式其意义是不同的!下来我们来对这四种赋值方式进行一一的解释说明

a> 简单赋值(:=):程序设计语言中的通用的赋值方式,只针对当前语句的变量是有效的。其用法如下

b> 递归赋值(=):赋值操作可能影响多个其他变量,所有与目标变量相关的其他变量都将受到影响。其用法如下

c> 条件赋值(?=):如果变量未定义,使用赋值符号中的值定义变量;如果变量已经定义,则赋值无效。其用法如下

d> 追加赋值(+=):原变量值之后加上一个新值,原变量值与新值之间由空格隔开。其用法如下

下来我们还是以代码为例来进行说明

# ex1 (:=)x := fooy := $(x)bx := new.PHONY : testtest :    @echo "# ex1 (:=)"    @echo "x => $(x)"    @echo "y => $(y)"

经过简单赋值后,x 就为 new 了,而 y 则应该为 foob。我们来看看编译效果

我们看到结果和我们所分析的是一样的。下来我们来看看递归赋值

# ex2 (=)x = fooy = $(x)bx = new.PHONY : testtest :    @echo "# ex2 (=)"    @echo "x => $(x)"    @echo "y => $(y)"

我们分析下,因为递归赋值是与目标相关的其他变量都会受到影响,那么 x 最后应该为 new,y 就应该为 newb。我们来看看编译结果

为了更加形象对递归赋值进行说明,我们编写代码如下

a = $(b)b = $(c)c = hello-makefile.PHONY : testtest :    @echo "# ex2 (=)"    @echo "x => $(x)"    @echo "y => $(y)"    @echo "a => $(a)"    @echo "b => $(b)"    @echo "c => $(c)"

我们定义 a 依赖于 b,而 b 依赖于 c。此时 c 为 hello-makefile,那么依赖于它的 b 也就变为 hello-makefile 了,此时依赖于 b 的 a 也就变为 hello-makefile 了。x 和 y 此时没定义,看看编译会报错吗?

编译是通过的,证明在 makefile 中是支持这样的写法的,x 和 y 没定义,自然也就为空了。那么 a,b,c 和我们所分析的是一样的。所以在 makefile 中我们一般是很少直接用递归赋值的,因为有可能会意想不到地改变依赖于它的目标。下来我们来看看条件赋值

# ex3 (?=)x := fooy := $(x)bx ?= new.PHONY : testtest :    @echo "# ex3 (?=)"    @echo "x => $(x)"    @echo "y => $(y)"

我们在最后对 x ?= new,意思是如果前面没定义的话,此时它便为 new。所以 x 最后应该为 foo,y 就应该为 foob。我们来看看编译结果

结果确实是这样的,一般我们会在新定义变量时采用这样的写法,以防止改变之前定义时的语义。最后看看追加赋值

# ex4 (+=)x := fooy := $(x)bx += new.PHONY : testtest :    @echo "# ex4 (+=)"    @echo "x => $(x)"    @echo "y => $(y)"

根据追加赋值的定义,它是直接在后面加上,但是有一个空格。所以 x 最后应该为 foo new,y 就应该为 foob。我们来看看编译结果

我们看懂啊效果确实是这样的,通过对四种赋值方式的学习,我们发现简单赋值是跟 C 语言中是一样的。追加赋值和 C++ 语言中的语义也是一样的,一般在大型项目中是不会采用递归赋值这种写法的。


欢迎大家一起来学习 makefile,可以加我QQ:243343083。

变量 编译 递归 结果 方式 不同 效果 语言 分析 代码 写法 条件 目标 编译器 影响 字符 版本 程序 程序设计 空格 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 咖啡网 互联网是第几次科技革命的成果 广州百单互联网科技有限公司 互联网科技巨头监管 科技股互联网 互联网科技有限公司图片 善班互联网科技有限公司 上海致骋互联网科技 火传媒上海互联网科技 北京三清互联网科技 华夏互联网科技业 互联网科技公司有风险吗 深圳市优智互联网科技有限公司 互联网金融科技展 黑科技 体验场景 互联网大会 21世纪互联网科技成就 有人说阿里系是互联网科技企业 陕西云淼互联网科技公司 半导体行业属于互联网高科技类吗 广州梦谷互联网科技有限公司领导 万易互联网科技 中国互联网科技发展 善班互联网科技有限公司 撒么互联网科技公司 成都玖崟互联网科技有限公司乐商圈怎么样 电子科技大学互联网创业大赛 江苏苏星互联网科技有限公司 半导体行业属于互联网高科技类吗 科技互联网专业工作会议发言稿 科技互联网企业在行动
0