В чем разница между присваиванием переменных в Makefile GNU =,? =,: = И + =?

Преимущество проверки на стороне сервера с помощью проверки на стороне клиента заключается в том, что проверка на стороне клиента может быть обойдена / изменена:

  • Конечный пользователь может отключить javascript
  • Данные могут быть отправлены непосредственно на ваш сервер кем-то, кто даже не использует ваш сайт, с помощью специального приложения, предназначенного для этого.
  • Ошибка Javascript на вашей странице (вызванная любым количеством вещей) может привести к некоторые, но не все, вашей проверки работоспособности

Короче - всегда всегда проверяйте серверную сторону, а затем рассматривайте проверку на стороне клиента как добавленную «дополнительную», чтобы улучшить работу конечного пользователя .

713
задан Ciro Santilli 新疆改造中心996ICU六四事件 12 July 2017 в 08:06
поделиться

3 ответа

Ленивый Набор

VARIABLE = value

установка Normal переменной - оценивает в нем, рекурсивно расширены, когда переменная используется, не, когда это объявило

Непосредственный Набор

VARIABLE := value

, Установка переменной с простым расширением значений внутри - оценивает в нем, расширены во время объявления.

Набор, Если Отсутствующий

VARIABLE ?= value

Установка переменной, только если это не имеет значения

, Добавляет

VARIABLE += value

Добавление предоставленного значения к существующему значению (или установка на то значение, если переменная не существовала)

955
ответ дан Eric 12 July 2017 в 08:06
поделиться
  • 1
    Хотя хороший, этот ответ doesn' t действительно обращаются к вопросу. Необходимо, по крайней мере, включать слово " no" там где-нибудь:) – Hubro 29 April 2013 в 08:39

Когда Вы используете VARIABLE = value, если value на самом деле ссылка на другую переменную, то значение только определяется, когда VARIABLE используется. Это лучше всего проиллюстрировано с примером:

VAL = foo
VARIABLE = $(VAL)
VAL = bar

# VARIABLE and VAL will both evaluate to "bar"

, Когда Вы используете VARIABLE := value, Вы получаете значение value , как это теперь . Например:

VAL = foo
VARIABLE := $(VAL)
VAL = bar

# VAL will evaluate to "bar", but VARIABLE will evaluate to "foo"

Используя VARIABLE ?= val средства, что Вы только устанавливаете значение VARIABLE , если VARIABLE уже не установлен. Если это уже не установлено, установка значения задерживается, до VARIABLE используется (в качестве в примере 1).

VARIABLE += value просто добавляет value к [1 113]. Фактическое значение [1 114] определяется, как это было, когда это было первоначально установлено, с помощью или = или :=.

31
ответ дан mipadi 12 July 2017 в 08:06
поделиться
  • 1
    но эй, didn' t мы получаем конструкцию goto, по крайней мере? дрожь – tacone 27 December 2013 в 13:16

Используя [1 128] = причины переменная, которой присвоят значение. Если переменная уже имела значение, она заменяется. Это значение будет расширено, когда оно будет использоваться. Например:

HELLO = world
HELLO_WORLD = $(HELLO) world!

# This echoes "world world!"
echo $(HELLO_WORLD)

HELLO = hello

# This echoes "hello world!"
echo $(HELLO_WORLD)

Используя [1 129] := подобно использованию =. Однако вместо значения, расширяемого, когда это используется, это расширено во время присвоения. Например:

HELLO = world
HELLO_WORLD := $(HELLO) world!

# This echoes "world world!"
echo $(HELLO_WORLD)

HELLO = hello

# Still echoes "world world!"
echo $(HELLO_WORLD)

HELLO_WORLD := $(HELLO) world!

# This echoes "hello world!"
echo $(HELLO_WORLD)

Используя [1 130] ?= присваивает переменной значение эквивалентность , переменная не была ранее присвоена. Если переменной ранее присвоили пустое значение (VAR=), это все еще считают установленным , я думаю . Иначе, функции точно как =.

Используя [1 131] += похож на использование =, но вместо того, чтобы заменить значение, значение добавляется к текущему с промежуточным пространством. Если переменная была ранее установлена с [1 111], она расширена , я думаю . Получающееся значение расширено, когда оно используется , я думаю . Например:

HELLO_WORLD = hello
HELLO_WORLD += world!

# This echoes "hello world!"
echo $(HELLO_WORLD)

, Если бы что-то как [1 112] использовалось, рекурсия закончилась бы, который, скорее всего, закончил бы выполнение Вашего Make-файла. Если бы A := $(A) $(B) использовались, результат не был бы тем же самым как использование +=, потому что B расширен с [1 116], тогда как += не заставил бы B быть расширенным.

244
ответ дан strager 12 July 2017 в 08:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: