Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Variables 什么';Makefile中括号$()和花括号${}语法的区别是什么?_Variables_Syntax_Makefile - Fatal编程技术网

Variables 什么';Makefile中括号$()和花括号${}语法的区别是什么?

Variables 什么';Makefile中括号$()和花括号${}语法的区别是什么?,variables,syntax,makefile,Variables,Syntax,Makefile,使用语法${var}和$(var)调用变量是否有任何区别?例如,在变量的展开方式或其他方面没有区别——它们的意思完全相同(在GNU Make和POSIX Make中) 我认为$(圆括号)看起来更整洁,但这只是个人喜好 (其他答案指向GNU Make文档的相关部分,并注意不应在单个表达式中混合语法)来自GNU Make文档状态的无差异: 要替换变量的值,请在后面写一个美元符号,后跟 括号或大括号中变量的名称:或者$(foo)或者 ${foo}是变量foo的有效引用 实际上,这似乎是相当不同的: ,

使用语法
${var}
$(var)
调用变量是否有任何区别?例如,在变量的展开方式或其他方面没有区别——它们的意思完全相同(在GNU Make和POSIX Make中)

我认为
$(圆括号)
看起来更整洁,但这只是个人喜好

(其他答案指向GNU Make文档的相关部分,并注意不应在单个表达式中混合语法)

来自
GNU Make
文档状态的无差异:

要替换变量的值,请在后面写一个美元符号,后跟 括号或大括号中变量的名称:或者
$(foo)
或者
${foo}
是变量foo的有效引用


实际上,这似乎是相当不同的:

, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)
输出

a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.

但到目前为止,我只在${…}中的变量名本身包含一个逗号时发现了这种差异。我首先认为${…}扩展逗号不是作为值的一部分,但事实证明,我无法以这种方式对其进行破解。我还是不明白。。。如果有人有解释,我很高兴知道

正如已经正确指出的那样,没有区别,但是要小心不要将这两种分隔符混用,因为它可能会导致像GNU那样的神秘错误

来自(我的):

[…]如果参数本身包含其他函数调用或变量引用,最好对所有引用使用相同类型的分隔符;写
$(子段a、b、$(x))
,而不是
$(子段a、b、${x})
。这是因为它更清晰,因为只有一种类型的分隔符匹配以查找引用的结尾


${}样式允许您在shell中测试make规则(如果设置了相应的环境变量),因为它与bash兼容。

如果表达式包含不平衡的括号,则会产生不同:

${info ${subst ),(,:-)}}
$(info $(subst ),(,:-)))
->


对于变量引用,这会对函数或包含方括号的变量名产生影响(坏主意)

我在make中使用
$()
,以避免在make和shell变量之间造成混淆(比已经存在的更多)。感谢user@Eloy建议对此答案进行扩展,尽管我拒绝了他们的概要,而只是简单地指出了其他答案中有价值的额外要点。有些工具可能不尊重它们的相同之处。IntelliJ IDEA对我来说突出显示了
deploy:${DEPS}
作为语法错误,但显示
deploy:$(DEPS)
是正确的,即使在
make
中调用这两种拼写时效果相同。
ifeq
条件要求使用圆括号进行相等性检查。你不能在那条线上安全地使用花括号。因此,我倾向于
$(圆括号)
。根据Edouard的回答,他指出GNU make文档声明没有区别,我猜这可能只是一个bug。正如Alexandre Perrin在回答中指出的,这两个语法不应该混合在同一行中。
:-(
*** insufficient number of arguments (1) to function 'subst'.  Stop.