千家信息网

条件判断语句(七)

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,我们之前说过 makefile 是一种脚本语言程序,那么程序便会有相应的语法。在 makefile 中支持条件判断语句,可以根据条件的值来决定 make 的执行,也可以比较两个不同变量或者变量和常量值
千家信息网最后更新 2026年11月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安全错误 数据库的锁怎样保障安全 咖啡 深圳九邦互联网科技有限公司 互联网通讯科技 互联网巨头反垄断金融科技 美国互联网黑科技 兼蜜互联网科技 上海电发互联网科技有限公司 成都玖崟互联网科技有限公司乐商圈怎么样 科技与互联网哪个更好 互联网还是高科技吗 湖北码尼互联网科技有限公司电话 浙江互联网科技研学营 中和天地互联网科技有限公司 南通创西澳互联网科技有限公司 互联网科技包装股 信承诺互联网科技有限公司 互联网科技接地气 互联网界的黑科技 数字科技和互联网金融哪个好 互联网科技快速发展优美句子 湖南永感互联网科技有限公司 云信互联网科技有限公司 互联网是不是新科技 以房互联网科技 广州互联网络科技有限公司 北京华百购互联网科技有限公司 互联网科技创新服务 深圳互联网科技园地址 现代科技的标志之一的互联网 每日互联网科技新闻
0