You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何该Makefile未按预期运行?添加call才生效的原因

Makefile变量展开与函数调用的区别

原写法失效的原因

原代码中foo := $($(func) $(bar))的展开逻辑是:

  1. 先展开$(func)得到sort,展开$(bar)得到a d b g q c;
  2. 此时整个表达式变为$(sort a d b g q c),但这不符合Makefile的语法规则——普通$()变量展开的括号内只能是单一变量名,这里的sort a d b g q c是带空格的字符串,不存在同名变量,因此展开结果为空,最终foo的值是空字符串,执行echo $(foo)自然只输出echo。

修改后生效的原因

$(call $(func), $(bar))是Makefile专门用于间接调用函数的内置语法:

  1. 它会把第一个参数解析为函数名(这里就是sort);
  2. 将后续参数($(bar)展开后的a d b g q c)传递给该函数;
  3. 最终执行sort内置函数对参数排序,得到a b c d g q并赋值给foo,所以执行echo $(foo)能输出预期内容。

补充说明:如果直接写$(sort a d b g q c)是可以正常调用排序函数的,但当函数名通过变量(如$(func))间接引用时,必须用$(call)来明确分隔函数名和参数,否则Makefile会把整个内容当作变量名处理,无法识别为函数调用。

内容的提问来源于stack exchange,提问作者mueller tee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:03:12