鱼C论坛

 找回密码
 立即注册
查看: 150|回复: 3

makefile 使用扩展赋值= 对变量进行赋值并检查器是否定义

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

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

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

x
如下makefile代码:


var3 =
var4=$(var3)

var_t:
ifdef var3
        @echo "var3 is define"
else
        @echo "var3 is not define"
endif

ifdef var4
        @echo "var4 is define"
else
        @echo "var4 is not define"
endif

输入make运行上述代码, 输出结果为:
var3 is not define
var4 is define

为什么会认为var4已经被定义了?

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2025-3-13 14:59:35 | 显示全部楼层
在 Makefile 中,`ifdef` 语句用于检查变量是否被定义,但它的判断标准是变量是否为空,而不是变量是否存在。

### 代码分析:
var3 =    # var3 被定义,但为空
var4 = $(var3)  # var4 也被定义,并且它的值是 var3 的值(即空)

#### `ifdef var3`
- `var3` **已经被定义**,但它的值是空的。
- 在 Makefile 中,`ifdef` 只会在变量未定义时返回 `false`,但 `var3` **已经被定义**(即使为空)。
- 由于 `var3` 为空,`ifdef var3` 认为它 **未定义**,所以输出:
var3 is not define

#### `ifdef var4`
- `var4` 也被定义了,它的值是 `var3` 的值(即空)。
- 但 `var4` **确实被定义**,即使它的值是空的,`ifdef` 仍然认为它是 **已定义** 的。
- 因此,`ifdef var4` 认为它 **已定义**,所以输出:
var4 is define

### 结论:
- `ifdef` 只检查变量是否 **被定义**,而不是检查它是否为空。
- `var3` 被定义了,但为空,所以 `ifdef var3` 认为它未定义。
- `var4` 也被定义了(即使它的值是空的),所以 `ifdef var4` 认为它已定义。

如果你想检查变量是否为空,可以使用:
ifeq ($(var3),)
    @echo "var3 is empty"
endif
这样可以正确判断变量是否为空,而不是仅仅检查是否被定义。

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

使用道具 举报

 楼主| 发表于 2025-3-13 15:02:58 | 显示全部楼层
FishC 发表于 2025-3-13 14:59
在 Makefile 中,`ifdef` 语句用于检查变量是否被定义,但它的判断标准是变量是否为空,而不是变量是否存在 ...

ifdef var3 和ifdef var4   ifdef是如何判断 var3和var4的?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2025-3-13 15:03:11 | 显示全部楼层
鬼少 发表于 2025-03-13 15:02
FishC 发表于 2025-3-13 14:59
在 Makefile 中,`ifd ...


在 Makefile 中,`ifdef` 用于检查变量是否被定义,而 **"被定义"** 的标准是变量是否在 Makefile 中出现过,而不是它是否为空。  

### `ifdef` 的判断逻辑:
1. **如果变量在 Makefile 中被赋值(即使是空值),`ifdef` 认为它是已定义的。**
2. **如果变量从未被赋值,`ifdef` 认为它是未定义的。**

---

### 代码分析:
var3 =      # var3 被定义,但为空
var4 = $(var3)  # var4 也被定义,它的值是 var3(即空)

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

ifdef var4
t@echo "var4 is define"
else
t@echo "var4 is not define"
endif

---

### `ifdef var3` 判断:
- `var3` **在 Makefile 中被赋值**(即使是空值)。
- 但 `ifdef` 只检查变量是否 **被定义**,而不是检查它是否为空。
- **GNU Make 认为 `var3` 没有值,因此 `ifdef var3` 结果为 false**,输出:
var3 is not define

---

### `ifdef var4` 判断:
- `var4` **在 Makefile 中被赋值**,它的值是 `var3`(即空)。
- 但 `var4` **确实被定义**,即使它的值是空的,`ifdef` 仍然认为它是 **已定义** 的。
- **GNU Make 认为 `var4` 被定义,因此 `ifdef var4` 结果为 true**,输出:
var4 is define

---

### 结论:
- `ifdef` 只检查变量是否 **被定义**,而不是检查它是否为空。
- `var3` 被定义了,但为空,所以 `ifdef var3` 认为它未定义。
- `var4` 也被定义了(即使它的值是空的),所以 `ifdef var4` 认为它已定义。

---

### 解决方案:
如果你想检查变量是否为空,而不是仅仅检查是否被定义,可以使用:
ifeq ($(var3),)
    @echo "var3 is empty"
endif
这样可以正确判断变量是否为空,而不是仅仅检查是否被定义。

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-2 22:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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