網(wǎng)站開發(fā)實(shí)訓(xùn)報(bào)告參考文獻(xiàn)國內(nèi)真正的永久免費(fèi)建站
目錄
一、foreach 函數(shù)
二、if 函數(shù)
三、call 函數(shù)
一、foreach 函數(shù)
????????foreach 函數(shù)和別的函數(shù)非常的不一樣。因?yàn)檫@個(gè)函數(shù)是用來做循環(huán)用的,Makefile 中的 foreach 函數(shù)幾乎是仿照于 Unix 標(biāo)準(zhǔn) Shell(/bin/sh)中的 for 語句,或是 C-Shell (/bin/csh)中的 foreach 語句而構(gòu)建的。它的語法是:
$(foreach?<var>,<list>,<text>)
????????這個(gè)函數(shù)的意思是,把參數(shù)<list>中的單詞逐一取出放到參數(shù)<var>所指定的變量中, 然后再執(zhí)行<text>所包含的表達(dá)式。每一次<text>會返回一個(gè)字符串,循環(huán)過程中, <text>的所返回的每個(gè)字符串會以空格分隔,最后當(dāng)整個(gè)循環(huán)結(jié)束時(shí),<text>所返回的每個(gè)字符串 所組成的整個(gè)字符串(以空格分隔)將會是 foreach 函數(shù)的返回值。
????????所以,<var>最好是一個(gè)變量名,<list>可以是一個(gè)表達(dá)式,而<text>中一般會使用<var> 這個(gè)參數(shù)來依次枚舉<list>中的單詞。舉個(gè)例子:
names := a b c d
files := $(foreach n,$(names),$(n).o)
????????上面的例子中,$(name)中的單詞會被挨個(gè)取出,并存到變量“n”中,“$(n).o”每次 根據(jù)“$(n)”計(jì)算出一個(gè)值,這些值以空格分隔,最后作為 foreach 函數(shù)的返回,所以, $(files)的值是“a.o b.o c.o d.o”。
????????注意,foreach 中的<var>參數(shù)是一個(gè)臨時(shí)的局部變量,foreach 函數(shù)執(zhí)行完后,參數(shù)<var> 的變量將不在作用,其作用域只在 foreach 函數(shù)當(dāng)中。
二、if 函數(shù)
????????if 函數(shù)很像 GNU 的 make 所支持的條件語句——ifeq(參見前面所述的章節(jié)),if 函數(shù) 的語法是:
$(if <condition>,<then-part>)
或是
$(if <condition>,<then-part>,<else-part>)
????????可見,if 函數(shù)可以包含“else”部分,或是不含。即 if 函數(shù)的參數(shù)可以是兩個(gè),也可 以是三個(gè)。<condition>參數(shù)是 if 的表達(dá)式,如果其返回的為非空字符串,那么這個(gè)表達(dá)式 就相當(dāng)于返回真,于是,<then-part>會被計(jì)算,否則<else-part>會被計(jì)算。
????????而 if 函數(shù)的返回值是,如果(condition)為真(非空字符串),那個(gè)<then-part>會是整 個(gè)函數(shù)的返回值,如果<condition>為假(空字符串),那么<else-part>會是整個(gè)函數(shù)的返 回值,此時(shí)如果沒有被定義,那么,整個(gè)函數(shù)返回空字串。
????????所以,<then-part>和<else-part>只會有一個(gè)被計(jì)算。
三、call 函數(shù)
????????call 函數(shù)是唯一一個(gè)可以用來創(chuàng)建新的參數(shù)化的函數(shù)。你可以寫一個(gè)非常復(fù)雜的表達(dá) 式,這個(gè)表達(dá)式中,你可以定義許多參數(shù),然后你可以用 call 函數(shù)來向這個(gè)表達(dá)式傳遞參 數(shù)。其語法是:
$(call <expression>,<pram1>,<pram2>,<pram3>...)
????????當(dāng) make 執(zhí)行這個(gè)函數(shù)時(shí),參數(shù)中的變量,如$(1),$(2),$(3)等,會被 參數(shù),,依次取代。而的返回值就是 call 函數(shù)的返回 值。例如:
reverse = $(1) $(2)
foo = $(call reverse,a,b)
????????那么,foo 的值就是“a b”。當(dāng)然,參數(shù)的次序是可以自定義的,不一定是順序的,
如:
reverse = $(2) $(1)
foo = $(call reverse,a,b)
此時(shí)的 foo 的值就是“b a”。