В чем разница между синтаксисом скобок $() и фигурной скобкой ${} в Makefile?
есть ли какие-либо различия в вызове переменных с синтаксисом ${var}
и $(var)
? Например, в том, как переменная будет расширена или что-то еще?
5 ответов:
нет никакой разницы – они означают точно то же самое (в GNU Make и в POSIX make).
думаю, что
$(round brackets)
выглядеть опрятнее, но это просто личные предпочтения.(другие ответы указывают на соответствующие разделы документации GNU Make и отмечают, что вы не должны смешивать синтаксисы в одном выражении)
The основы ссылок на переменные раздел С
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.
но до сих пор я только нашел эту разницу, когда имя переменной в ${...} содержит запятую. Сначала я подумал ${...} расширял запятую не как часть значения, но оказалось, что я не могу взломать его таким образом. Я все еще не понимаю этого... Если бы у кого-нибудь было объяснение, я был бы счастлив узнать !
Как уже правильно указывалось, разницы нет но будьте осторожны, чтобы не смешивать два вида разделителей, поскольку это может привести к загадочным ошибкам, таким как unomadh GNU сделать пример.
С руководство GNU make по синтаксису вызова функции (выделено мной):
[...] если сами аргументы содержат другие вызовы функций или ссылки на переменные, разумнее всего использовать один и тот же тип разделителей для всех ссылки; написать
$(subst a,b,$(x))
, а не$(subst a,b,${x})
. Это потому, что это яснее, и потому что только один тип разделителя подбирается, чтобы найти конец ссылка.