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