鱼C论坛

 找回密码
 立即注册
查看: 109|回复: 1

makefile 用立即复制:=对变量赋值空字符引起的问题

[复制链接]
发表于 2025-3-13 14:53:21 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
如下makefile代码“


var2 :=
var_m :=$(var2)

var_t:
ifdef var2
        @echo "var2 is define"
else
        @echo "var2 is not define"
endif
ifdef var_m
        @echo "var_m is define"
else
        @echo "var_m is not define"
endif


输入makefile运行命令make, 输出结果为:
var2 is not define
var_m is not define


为什么是这样的输出结果?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-13 14:53:36 | 显示全部楼层
在 Makefile 中,`:=` 是立即赋值(即在解析时就计算并存储值),而 `ifdef` 语句用于检查变量是否被定义。  

你的 Makefile 代码如下:  
var2 :=  
var_m := $(var2)  

var_t:  
ifdef var2  
t@echo "var2 is define"  
else  
t@echo "var2 is not define"  
endif  
ifdef var_m  
t@echo "var_m is define"  
else  
t@echo "var_m is not define"  
endif

### **分析**
1. `var2 :=` 这行代码将 `var2` 赋值为空字符串(但仍然被认为是“已定义”)。
2. `var_m := $(var2)` 由于 `var2` 为空,因此 `var_m` 也被赋值为空字符串。
3. `ifdef` 语句在 Makefile 中的行为是:
   - 变量 **未定义** 时,`ifdef` 认为它是“未定义”。
   - 变量 **定义但为空** 时,`ifdef` 仍然认为它是“未定义”。
4. 由于 `var2` 和 `var_m` 都是空字符串,`ifdef var2` 和 `ifdef var_m` 都会判断它们为“未定义”。

### **为什么输出是这样?**
- `var2 is not define`:因为 `var2` 为空,`ifdef var2` 认为它未定义。
- `var_m is not define`:因为 `var_m` 也是空,`ifdef var_m` 认为它未定义。

### **如何修正?**
如果你想让 `ifdef` 识别 `var2` 和 `var_m` 为“已定义”,可以使用 `?=` 赋值,或者改用 `ifeq` 进行判断:
var2 :=  
var_m := $(var2)  

var_t:  
ifeq ($(var2),)  
t@echo "var2 is not define"  
else  
t@echo "var2 is define"  
endif  

ifeq ($(var_m),)  
t@echo "var_m is not define"  
else  
t@echo "var_m is define"  
endif

这样 `ifeq ($(var2),)` 直接检查变量是否为空,而不是依赖 `ifdef`,就能正确判断变量是否为空了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 0 反对 1

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-2 21:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表