Édo*_*pez 90 variables syntax makefile
是否有语法调用变量的任何差异${var}和$(var)?例如,变量将被扩展的方式还是什么?
Nor*_*ray 76
没有区别 - 它们的意思完全相同(在GNU Make和POSIX make中).
我认为这$(round brackets)看起来更整洁,但这只是个人偏好.
(其他答案指向GNU Make文档的相关部分,并注意您不应在单个表达式中混合语法)
小智 12
正如已经正确指出的那样,没有区别但是要小心不要混合两种分隔符,因为它可能导致像unomadh GNU make 这样的神秘错误.
从函数调用语法的GNU make手册(强调我的):
[...]如果参数本身包含其他函数调用或变量引用,则最明智的做法是对所有引用使用相同类型的分隔符; 写
$(subst a,b,$(x)),不$(subst a,b,${x}).这是因为它更清晰,并且因为只匹配一种类型的分隔符来查找引用的结尾.
uno*_*adh 11
实际上,它似乎是完全不同的:
, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
Run Code Online (Sandbox Code Playgroud)
输出
a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.
Run Code Online (Sandbox Code Playgroud)
但到目前为止,当$ {...}中的变量名称包含逗号时,我才发现这种差异.我首先想到$ {...}正在扩展逗号而不是作为值的一部分,但事实证明我无法以这种方式破解它.我仍然不明白......如果有人有解释,我会很高兴知道!
小智 5
如果表达式包含不平衡的括号,则会产生影响:
${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
Run Code Online (Sandbox Code Playgroud)
->
:-(
*** insufficient number of arguments (1) to function 'subst'. Stop.
Run Code Online (Sandbox Code Playgroud)
对于变量引用,这会对函数或包含括号的变量名产生影响(坏主意)