Makefile
для моего очень маленького проекта:getPixelColor
Он делает именно то, что говорит его название, принимая два необязательных аргумента — координаты.
Мне особенно нравится, как там все становится зависимым.
COORDS ?= 0 0
CXX := g++-8
CXXFLAGS := -std=c++17 -Wall -Wextra -Werror -Wpedantic -pedantic-errors
LDLIBS := -lX11
RM := rm -f
BIN := getPixelColor
SRC := $(BIN).cpp
$(BIN): $(SRC)
$(CXX) $(CXXFLAGS) $(SRC) -o $(BIN) $(LDLIBS)
.PHONY: clean
clean:
$(RM) $(BIN)
.PHONY: run
run: $(BIN)
./$(BIN) $(COORDS)
Как видите, он может делать все, что вам нужно, не вводя ничего лишнего:
Вы можете запустить это так:
Очистить -старый бинарный файл:
make clean
Скомпилируйте новый бинарник:
make
Запустите исполняемый файл двумя способами:
координаты по умолчанию [0,0]
make run # equals COORDS='0 0'
любые заданные координаты
COORDS='5 6' make run
Makefiles иногда могут быть чрезвычайно полезны. Чем больше проект, тем больше выгода. Но даже с этим мой самый маленький проект на C++, как вы можете видеть на примерах, избавляет вас от многих головных болей.
Можно использовать расширение параметра
.$ arr=(a b c)
$ echo "${arr[@]/#/foo.}"
foo.a foo.b foo.c
Если вам не нужно использоватьbash
:
rc
/ es
/akanga
(это поведение по умолчанию):
$ arr=(a b c)
$ echo foo.$arr
foo.a foo.b foo.c
zsh
:$ arr=(a b c)
$ echo foo.$^arr
foo.a foo.b foo.c
Или
$ set -o rcexpandparam
$ arr=(a b c)
$ echo foo.$arr
foo.a foo.b foo.c
(^
включает rcexpandparam
для этого расширения, например =
включает shwordsplit
или~
globsubst
)
(также поведение по умолчанию)
$ set arr a b c
$ echo foo.$arr
foo.a foo.b foo.c
Все эти оболочки имеют лучший дизайн массива, чем сам bash (, скопированный из ksh )).
Обратите внимание, что раскрытие zsh
и fish
работает аналогично раскрытию скобок. В rc
отличается при использовании echo $arr.$arr
, что дает:
a.a b.b c.c
а в fish
/zsh -o rcexpandparam
выдает то же, что и echo {a,b,c}.{a,b,c}
, то есть:
a.a a.b a.c b.a b.b b.c c.a c.b c.c