Подтвердить что ты не робот

Какая разница между скобкой $() и фигурной скобкой ${} синтаксиса в Makefile?

Есть ли различия в вызове переменных с синтаксисом ${var} и $(var)? Например, в том, как будет расширяться переменная или что-нибудь еще?

4b9b3361

Ответ 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}). Это объясняется тем, что оно яснее и , потому что только один тип разделителя сопоставляется, чтобы найти конец ссылки.