1.1 字符操作函數使用
在Makefile中可以使用函數來處理變量,從而讓我們的命令或是規則更為的靈活和具有智能。make所支持的函數也不算很多,不過已經足夠我們的操作了。函數調用后,函數的返回值可以當做變量來使用。
函數調用,很像變量的使用,也是以“$”來標識的,其語法如下:
$(<function> <arguments> )
或是
${<function> <arguments>}
這里,<function>就是函數名,make支持的函數不多。<arguments>是函數的參數,參數間以逗號“,”分隔,而函數名和參數之間以“空格”分隔。函數調用以“$”開頭,以圓括號或花括號把函數名和參數括起。例如字符替換函數。
1.1.1 字符串替換函數
$(subst <from>,<to>,<text> )
名稱:字符串替換函數——subst。
功能:把字串<text>中的<from>字符串替換成<to>。
返回:函數返回被替換過后的字符串。
# Makefile 內容
all:
@echo $(subst t,e,maktfilt) <-- 將t替換為e
# bash 中執行 make
$ make
makefile
1.1.2 模式字符串替換函數
$(patsubst <pattern>,<replacement>,<text> )
名稱:模式字符串替換函數——patsubst。
功能:以通配符的形式替換字符,查找<text>中的單詞(單詞以“空格”、“Tab”或“回車”“換行”分隔)是否符合模式<pattern>,如果匹配的話,則以<replacement>替換。這里,<pattern>可以包括通配符“%”,表示任意長度的字串。如果<replacement>中也包含“%”,那么,<replacement>中的這個“%”將是<pattern>中的那個“%”所代表的字串。(可以用“\”來轉義,以“\%”來表示真實含義的“%”字符)返回:函數返回被替換過后的字符串。
示例:
$(patsubst %.c,%.o,x.c.c bar.c)
把字串“x.c.c bar.c”符合模式[%.c]的單詞替換成[%.o],返回結果是“x.c.o bar.o”
# Makefile 內容
all:
@echo $(patsubst %.c,%.o,programA.c programB.c)
# bash 中執行 make
$ make
programA.o programB.o
1.1.3 去首尾空格函數
名稱:去空格函數——strip。
功能:去掉<string>字串中開頭和結尾的空字符。
返回:返回被去掉空格的字符串值。
示例:
$(strip a b c )
把字串“a b c ”去到開頭和結尾的空格,結果是“a b c”。
# Makefile 內容
VAL := " aa bb cc "
all:
@echo "去除空格前: " $(VAL)
@echo "去除空格后: " $(strip $(VAL))
# bash 中執行 make
$ make
去除空格前: aa bb cc
去除空格后: aa bb cc
1.1.4 查找字符串函數
$(findstring <find>,<in> )
名稱:查找字符串函數——findstring。
功能:在字串<in>中查找<find>字串。
返回:如果找到,那么返回找到的字符串,否則返回空字符串。
示例:
$(findstring a,a b c)
$(findstring a,b c)
第一個函數返回“a”字符串,第二個返回“”字符串(空字符串)
# Makefile 內容
VAL := " aa bb cc "
all:
@echo $(findstring aa,$(VAL))
@echo $(findstring ab,$(VAL))
# bash 中執行 make
$ make
aa
1.1.5 過濾函數
$(filter <pattern...>,<text> )
名稱:過濾函數——filter。
功能:以<pattern>模式過濾<text>字符串中的單詞,保留符合模式<pattern>的單詞。可以有多個模式。
返回:返回符合模式<pattern>的字串。
示例:
sources := foo.c bar.c baz.s ugh.h
foo: $(sources)
cc $(filter %.c %.s,$(sources)) -o foo
$(filter %.c %.s,$(sources))返回的值是“foo.c bar.c baz.s”。
$(filter-out <pattern...>,<text> )
# Makefile 內容
all:
@echo $(filter %.o %.a,program.c program.o program.a)
# bash 中執行 make
$ make
program.o program.a
1.1.6 反過濾函數
名稱:反過濾函數——filter-out。
功能:以<pattern>模式過濾<text>字符串中的單詞,去除符合模式<pattern>的單詞。可
以有多個模式。
返回:返回不符合模式<pattern>的字串。
示例:
objects=main1.o foo.o main2.o bar.o
mains=main1.o main2.o
$(filter-out $(mains),$(objects)) 返回值是“foo.o bar.o”。
# Makefile 內容
all:
@echo $(filter-out %.o %.a,program.c program.o program.a)
# bash 中執行 make
$ make
program.c
1.1.7 排序函數
名稱:排序函數——sort。
功能:給字符串<list>中的單詞排序(升序)。
返回:返回排序后的字符串。
示例:$(sort foo bar lose)返回“bar foo lose” 。
備注:sort函數會去掉<list>中相同的單詞。
$(word <n>,<text> )
# Makefile 內容
all:
@echo $(sort bac abc acb cab)
# bash 中執行 make
$ make
abc acb bac cab
1.1.8 取單詞函數
名稱:取單詞函數——word。
功能:取字符串<text>中第<n>個單詞。空格隔開(從一開始)
返回:返回字符串<text>中第<n>個單詞。如果<n>比<text>中的單詞數要大,那么返回空
字符串。
示例:$(word 2, foo bar baz)返回值是“bar”。
$(wordlist <s>,<e>,<text> )
# Makefile 內容
all:
@echo $(word 1,aa bb cc dd)
@echo $(word 5,aa bb cc dd)
@echo $(word 4,aa bb cc dd)
# bash 中執行 make
$ make
aa
dd
1.1.9 取單詞串函數wordlist
名稱:取單詞串函數——wordlist。
功能:從字符串<text>中取從<s>開始到<e>的單詞串。<s>和<e>是一個數字。
返回:返回字符串<text>中從<s>到<e>的單詞字串。如果<s>比<text>中的單詞數要大,那
么返回空字符串。如果<e>大於<text>的單詞數,那么返回從<s>開始,到<text>結束的單
詞串。
示例: $(wordlist 2, 3, foo bar baz)返回值是“bar baz”。
# Makefile 內容
all:
@echo $(wordlist 1,3,aa bb cc dd)
@echo $(word 5,6,aa bb cc dd)
@echo $(word 2,5,aa bb cc dd)
# bash 中執行 make
$ make
aa bb cc
bb
1.1.10 單詞個數統計函數words
$(words <text> )
名稱:單詞個數統計函數——words。
功能:統計<text>中字符串中的單詞個數。
返回:返回<text>中的單詞數。
示例:$(words, foo bar baz)返回值是“3”。
備注:如果我們要取<text>中最后的一個單詞,我們可以這樣:$(word $(words <text>
),<text> )。
# Makefile 內容
all:
@echo $(words aa bb cc dd)
@echo $(words aabbccdd)
@echo $(words )
# bash 中執行 make
$ make
4
1
0
1.1.11 首單詞函數firstword
$(firstword <text> )
名稱:首單詞函數——firstword。
功能:取字符串<text>中的第一個單詞。
返回:返回字符串<text>的第一個單詞。
示例:$(firstword foo bar)返回值是“foo”。
備注:這個函數可以用word函數來實現:$(word 1,<text> )。
小結:以上,是所有的字符串操作函數,如果搭配混合使用,可以完成比較復雜的功能。這里,舉一個現實中應用的例子。我們知道,make使用“VPATH”變量來指定“依賴文件”的搜索路徑。於是,我們可以利用這個搜索路徑來指定編譯器對頭文件的搜索路徑參數CFLAGS,
如將頭文件路徑的前面加上-I表示包含路徑:
override CFLAGS += $(patsubst %,-I%,$(subst :, ,$(VPATH)))
如果我們的“$(VPATH)”值是“src:../headers”,VPATH之間用分號{:}隔開,$(subst :, ,$(VPATH)) 先將路徑中的分號替換為空格src ../headers,然后模式替換函數$(patsubst %,-I%,)在每個路徑前面加上-I,表示包含文件路徑,生成 “-Isrc -I../headers”,這正是cc或gcc搜索頭文件路徑的參數。
自己編了一個股票監控軟件,有如下功能,有興趣的朋友可以下載;
(1) 個股監測。監測個股實時變化,可以監測個股大單交易、急速拉升和下降、主力入場和出場、股票最高點和最低點提醒。檢測到最高點、最低點、主力進場點、主力退場點、急速拉升點、急速下跌點,給出語音或者聲音提醒,不用再時刻看着大盤了,給你更多自由的時間;
(2) 大盤監測。監測大盤的走勢,采用上證、深證、創業三大指數的綜合指數作為大盤走勢。並實時監測大盤的最高點和最低點、中間的轉折點。
(3) 股票推薦。還能根據歷史數據長期或短期走勢進行分析,對股市3千多個股票進行分析對比,選出漲勢良好的股票,按照增長速度從大到小排序,推薦給你漲勢良好的股票;
下載地址:
1.0.3版本(修復大盤指數崩潰缺陷)下載地址:
鏈接:https://pan.baidu.com/s/1BJcTp-kdniM7VE9K5Kd3vg 提取碼:003h
更新鏈接:
https://www.cnblogs.com/bclshuai/p/10621613.html