鱼C论坛

 找回密码
 立即注册
查看: 164|回复: 8

[技术交流] makefile ifeq与ifdef

[复制链接]
发表于 前天 16:17 | 显示全部楼层 |阅读模式

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

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

x
  1. makefile
  2. var := A
  3. var1 := $(var)
  4. var2 :=
  5. var_m :=$(var2)

  6. var3 =
  7. var4=$(var3)
  8. var_t:
  9. ifeq ($(var),$(var1))
  10.         @echo "var == var1"
  11. else
  12.         @echo "var != var1"        
  13. endif

  14. ifneq ($(var),$(var1))
  15.         @echo "var != var1"
  16. else
  17.         @echo "var == var1"
  18. endif

  19. ifeq ($(var2),)
  20.         @echo "var2 is empty"
  21. else
  22.         @echo "var2 is define"
  23. endif


  24. ifdef var2
  25.         @echo "var2 is define"
  26. else
  27.         @echo "var2 is not define"
  28. #        $(eval bm += q)
  29. #        @echo "bm: $(bm)"
  30. endif
  31. ifdef var_m
  32.         @echo "var_m is define"
  33. else
  34.         @echo "var_m is not define"
  35. endif


  36. ifdef var3
  37.         @echo "var3 is define"
  38. else
  39.         @echo "var3 is not define"
  40. endif


  41. ifeq ($(var4),)
  42.                 @echo "ifeq var4 is empty"
  43. else
  44.                 @echo "ifeq var4 is not define"
  45. endif
  46. ifdef var4
  47.         @echo "var4 is define"
  48. else
  49.         @echo "var4 is not define"
  50. endif
复制代码

执行上述代码时输出打印:

  1. var == var1
  2. var == var1
  3. var2 is empty
  4. var2 is not define
  5. var_m is not define
  6. var3 is not define
  7. ifeq var4 is empty
  8. var4 is define
复制代码

请解释下详细输出打印的原因
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 前天 16:19 | 显示全部楼层
以下是对Makefile输出结果的详细解释,重点分析`ifeq`、`ifneq`和`ifdef`的行为:

  1. [color=#008000][b]变量定义分析:[/b][/color]
  2. var := A           [color=#666666]# 立即赋值,值为 'A'[/color]
  3. var1 := $(var)     [color=#666666]# 立即展开为 'A'[/color]
  4. var2 :=            [color=#666666]# 定义为空字符串[/color]
  5. var_m := $(var2)   [color=#666666]# 立即展开为空字符串[/color]
  6. var3 =             [color=#666666]# 递归赋值为空字符串[/color]
  7. var4 = $(var3)     [color=#666666]# 递归赋值,值为表达式 [color=#FF0000]"$(var3)"[/color](非空字符串)[/color]

  8. [color=#008000][b]输出结果解析:[/b][/color]
  9. [color=#0000FF]1. var == var1[/color]
  10.    [color=#FF0000]ifeq ($(var),$(var1))[/color] → 比较 [color=#FF0000]'A' == 'A'[/color] → 成立

  11. [color=#0000FF]2. var == var1[/color]
  12.    [color=#FF0000]ifneq ($(var),$(var1))[/color] → 比较 [color=#FF0000]'A' != 'A'[/color] → 不成立 → 执行else分支

  13. [color=#0000FF]3. var2 is empty[/color]
  14.    [color=#FF0000]ifeq ($(var2),)[/color] → 判断 [color=#FF0000]$(var2)[/color] 是否为空 → 成立(因var2是空字符串)

  15. [color=#0000FF]4. var2 is not define[/color]
  16.    [color=#FF0000]ifdef var2[/color] → 检查变量是否被定义为非空值 → [color=#FF0000]失败[/color](因var2是空字符串)

  17. [color=#0000FF]5. var_m is not define[/color]
  18.    [color=#FF0000]ifdef var_m[/color] → 同上,var_m也是空字符串 → 失败

  19. [color=#0000FF]6. var3 is not define[/color]
  20.    [color=#FF0000]ifdef var3[/color] → var3是空字符串 → 失败

  21. [color=#0000FF]7. ifeq var4 is empty[/color]
  22.    [color=#FF0000]ifeq ($(var4),)[/color] → [color=#FF0000]$(var4)[/color] 展开为 [color=#FF0000]$(var3)[/color] → 最终为空 → 成立

  23. [color=#0000FF]8. var4 is define[/color]
  24.    [color=#FF0000]ifdef var4[/color] → 检查 [color=#FF0000]var4[/color] 是否被赋值(不检查值内容)→ [color=#FF0000]成立[/color](因var4被赋值为表达式 [color=#FF0000]"$(var3)"[/color])

  25. [color=#008000][b]核心规则总结:[/b][/color]
  26. 1. [color=#FF0000]ifeq/ifneq[/color]:比较变量[color=#FF0000]展开后的值[/color](空字符串视为空)
  27. 2. [color=#FF0000]ifdef[/color]:检查变量是否被定义为[color=#FF0000]非空字符串[/color](空字符串或未赋值均返回false)
  28. 3. 赋值方式的影响:
  29.    o [color=#FF0000]var4 = $(var3)[/color] 使 [color=#FF0000]var4[/color] 获得表达式字符串 [color=#FF0000]"$(var3)"[/color](非空)
  30.    o 但 [color=#FF0000]$(var4)[/color] 展开时继承 [color=#FF0000]var3[/color] 的空值
复制代码


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 19:57 | 显示全部楼层
@小甲鱼 @不二如是 建议可选是否启用 Latex…
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 20:34 | 显示全部楼层
player-none 发表于 2025-6-11 19:57
@小甲鱼 @不二如是 建议可选是否启用 Latex…

收到,自动触发了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 20:37 | 显示全部楼层


对啊,这就对很多药用到$符号的地方出现问题,影响鱼油交流+%/
test$1$
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 20:56 | 显示全部楼层
player-none 发表于 2025-6-11 20:37
对啊,这就对很多药用到$符号的地方出现问题,影响鱼油交流+%/
test$1$

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 00:10 | 显示全部楼层
player-none 发表于 2025-6-11 19:57
@小甲鱼 @不二如是 建议可选是否启用 Latex…

这个比较麻烦的点在于默认 Latex 就是在 $ 符号间触发,但如果改成其他符号的话,原来那些也得一并修改……看似无解……
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 00:21 | 显示全部楼层
  1. # 定义变量 var,赋值为 A(使用 := 表示简单赋值,立即展开右侧值)
  2. var := A

  3. # 定义变量 var1,其值为 var 的值,即 A
  4. var1 := $(var)

  5. # 定义变量 var2,赋空值
  6. var2 :=

  7. # 定义变量 var_m,其值为 var2 的值,即空
  8. var_m :=$(var2)

  9. # 定义变量 var3,赋空值(注意这里用了 =,是递归赋值,但此处无区别)
  10. var3 =

  11. # 定义变量 var4,其值为 var3 的值,即空
  12. var4=$(var3)

  13. # 定义伪目标 var_t
  14. var_t:

  15. # 下面是条件判断语句。ifeq 判断 $(var) 是否等于 $(var1)
  16. ifeq ($(var),$(var1))
  17.         @echo "var == var1"        # 如果相等,打印“var == var1”
  18. else
  19.         @echo "var != var1"        # 否则,打印“var != var1”
  20. endif

  21. # ifneq 判断 $(var) 是否不等于 $(var1)
  22. ifneq ($(var),$(var1))
  23.         @echo "var != var1"        # 如果不相等,打印“var != var1”
  24. else
  25.         @echo "var == var1"        # 否则,打印“var == var1”
  26. endif

  27. # ifeq 判断 $(var2) 是否为空字符串
  28. ifeq ($(var2),)
  29.         @echo "var2 is empty"      # 若为空,打印“var2 is empty”
  30. else
  31.         @echo "var2 is define"     # 否则,打印“var2 is define”
  32. endif

  33. # ifdef 判断 var2 是否被定义(即变量名是否声明,不管值是否为空)
  34. ifdef var2
  35.         @echo "var2 is define"     # 如果定义了,打印“var2 is define”
  36. else
  37.         @echo "var2 is not define" # 否则,打印“var2 is not define”
  38. #        $(eval bm += q)           # 这行被注释掉,若取消注释会给 bm 变量追加 q
  39. #        @echo "bm: $(bm)"         # 打印 bm 的值
  40. endif

  41. # ifdef 判断 var_m 是否被定义
  42. ifdef var_m
  43.         @echo "var_m is define"    # 如果定义了,打印“var_m is define”
  44. else
  45.         @echo "var_m is not define" # 否则,打印“var_m is not define”
  46. endif

  47. # ifdef 判断 var3 是否被定义
  48. ifdef var3
  49.         @echo "var3 is define"     # 如果定义了,打印“var3 is define”
  50. else
  51.         @echo "var3 is not define" # 否则,打印“var3 is not define”
  52. endif

  53. # ifeq 判断 $(var4) 是否为空字符串
  54. ifeq ($(var4),)
  55.                 @echo "ifeq var4 is empty"         # 若为空,打印“ifeq var4 is empty”
  56. else
  57.                 @echo "ifeq var4 is not define"    # 否则,打印“ifeq var4 is not define”
  58. endif

  59. # ifdef 判断 var4 是否被定义
  60. ifdef var4
  61.         @echo "var4 is define"     # 如果定义了,打印“var4 is define”
  62. else
  63.         @echo "var4 is not define" # 否则,打印“var4 is not define”
  64. endif
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 昨天 18:42 | 显示全部楼层
小甲鱼 发表于 2025-6-12 00:10
这个比较麻烦的点在于默认 Latex 就是在 $ 符号间触发,但如果改成其他符号的话,原来那些也得一并修改… ...

那就加个提示,“因论坛有 Latex 功能,故请用户使用记事本等文本编辑工具将不希望显示 Latex 的 $ 符号统一改成 <_DOLLAR_4_>” 之类的?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-13 09:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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