千家信息网

条件判断语句(七)

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,我们之前说过 makefile 是一种脚本语言程序,那么程序便会有相应的语法。在 makefile 中支持条件判断语句,可以根据条件的值来决定 make 的执行,也可以比较两个不同变量或者变量和常量值
千家信息网最后更新 2025年12月02日条件判断语句(七)

我们之前说过 makefile 是一种脚本语言程序,那么程序便会有相应的语法。在 makefile 中支持条件判断语句,可以根据条件的值来决定 make 的执行,也可以比较两个不同变量或者变量和常量值。需要注意的是:条件判断语句只能用于控制 make 实际执行的语句;但是,不能控制规则中命令的执行过程。格式如下

条件判断语句的语法如下

那么在 makefile 中都有哪些的条件判断关键呢?

关键字
功能
ifeq
判断参数是否相等,相等为 true,否则为 false
ifneq
判断参数是否不相等,不相等为 true,否则为 false
ifdef
判断变量是否有值,有值为 true,否则为 false
ifndef
判断变量是否没有值,没有值为 true,否则为 false

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

.PHONY : testvar1 := Avar2 := $(var1)var3 :=test :     ifeq ($(var1),$(var2))        @echo "var1 == var2"    else        @echo "var1 != var2"    endif    ifneq ($(var2),)        @echo "var2 is NOT empty"    else        @echo "var2 is empty"    endif    ifdef var2        @echo "var2 is NOT empty"    else        @echo "var2 is empty"    endif    ifndef var3        @echo "var3 is empty"    else        @echo "var3 is NOT empty"    endif

我们来看看编译结果

我们看到编译出错了,原因就是因为 ifeq 是规则而不是命令,所以它前面一定是空格而不是 Tab 键。下来我们换成空格来看看

我们看到编译已经通过了,而且也正常运行结束。变量 var2 就取的是 变量 var1 的值,因此在第一个它们的比较相等时肯定会输出相等;第二个用 var2 和空字符进行比较,那么 var2 肯定不为空;第三个就直接用 ifdef 关键字来进行判断 var2 是否存在了;最后一个 var3 肯定为空了。根据一些前辈们的经验,总结以下的几条规则:a> 条件判断语句之前可以有空格,但不能有 Tab 字符('\t');b> 在条件语句中不要使用自动变量($@,$^,$<);c> 一条完整的条件语句必须位于同一个 makefile 中;d> 条件判断类似于 C 语言中的宏,预处理阶段有效,执行阶段无效;e> make 在加载 makefile 时,首先计算表达式的值(赋值方式不同,计算方式不同),根据判断语句的表达式决定执行的内容。

那么我们来看看下面的代码输出相同吗?

.PHONY : tevar1 := var2 := $(var1)var3 = var4 = $(var3)test :     ifdef var1        @echo "var1 is defined"    else        @echo "var1 is NOT defined"    endif        ifdef var2        @echo "var2 is defined"    else        @echo "var2 is NOT defined"    endif    ifdef var3        @echo "var3 is defined"    else        @echo "var3 is NOT defined"    endif        ifdef var4        @echo "var4 is defined"    else        @echo "var4 is NOT defined"    endif

我们看着两个没啥差别,结果应该是一样的,都是输出的是空的。我们来看看编译结果

那么我们看到前三个是空的,var4 竟然不为空。我们来仔细看下,在 var1 和 var2 的定义中都是直接赋值(:=);而 var3 和 var4 是递归赋值(=)。在编译器看来 var4 是有值的,只不过在编译阶段不确定它的值究竟是什么而已。我们在下面加上 var3 = A,给 var3 一个具体的值,试试看效果是不是一样的。

效果是一样的。因此我们在 makefile 中不推荐递归赋值的这种写法,容易造成误解。通过对条件判断语句的学习,总结如下:1、条件判断根据条件的值来决定 make 的执行;2、条件判断可以比较两个不同变量或者变量和常量值;3、条件判断再预处理阶段有效,执行阶段无效;4、条件判断不能控制规则中命令的执行过程。

条件 语句 变量 编译 阶段 不同 规则 两个 关键 命令 结果 控制 肯定 输出 有效 三个 代码 关键字 参数 常量 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 怎么设计数据库框架 如何在2b2t服务器中生存下去 北京星网互联网科技有限公司 中国电子学会网络安全标准 淮北市信息网络安全 游戏服务器限制是什么意思 二道区机械网络安全答疑解惑 小蜜蜂软件开发 大兴区正规网络技术概况 为什么蓝鸟维修服务器注册不了 测绘技术成果管理数据库 网络安全机制及技术措施 数据库服务器端口类型 软件开发和系统适配流程 vb上传文件到服务器 关注私信软件开发 西藏大学网络安全第一课 青少年使用网络安全问题 外呼系统如何在服务器看手机号 区块链聊天软件开发 数据库系统的功能 网络安全周专题会议讲话 为什么育碧登录显示服务器 网络技术方面论文 金融软件开发维护 苹果手机总是显示连接到服务器时出现问题 产品研发和软件开发 建立网络安全信息共享机制 在哪里找网络安全员 新吴区项目软件开发优势
0