stl是英文standard template library的簡寫,中文名標準模板庫。我們今天不說它的容器呀,迭代器呀,匹配器呀,演算法呀這些,單說它的library。
「噢library呀!庫嘛。我哪個六歲半的學習程式設計的小兒子也知道。不就是庫嘛,有什麼好說的。」
然而,此庫非彼庫。stl的l雖然也是庫,但這個庫與已往的庫有一些在本質上的差異。這怕是乙個剛學程式設計的六歲半的小孩所不知道的吧。好了,閒言少敘,下面進入正題。
先從庫的老祖宗lib說起。要使用lib庫必需要有兩個檔案。乙個檔案是.h的,是庫的標頭檔案,用來說明庫里有什麼可用的內容。乙個檔案是.lib的,是庫的實現檔案,是庫的具體實現,同時它裡面也包含了一些定位資訊。這種庫被人們叫做靜態庫。因為這種的庫的使用方式是:在鏈結的過程中,直接就鏈入我們的目標檔案了。
再說現在比較流行的動態庫。動態庫一般會向外公開三個檔案。以windows的動態庫為例:乙個檔案是.h,乙個檔案是.lib,乙個檔案是.dll。.h檔案的作用和靜態庫的一樣,.lib的作用是包含一些匯出資訊。.dll檔案中包含真正的實現和定位資訊。
對比上面的兩種庫,我們發現.h檔案是它們中必不可少的。這是因為.h所擔當的角色:說明庫里有什麼可用的內容,而決定的。少了這個說明,這個庫可怎麼用呀。你能這樣和別人說嗎?「我給你乙個庫,你去用吧,但這個庫沒有用法」。所以,不論是靜態庫還是動態庫,都向外提供乙個.h檔案來說明這個庫的用法和內容。.h檔案就象是庫的乙個微型說明書。
最後我們看stl的庫。這種庫只提供一種檔案,而且沒有任何副檔名。這樣做的意思是說:「我可以一頂二(對於靜態庫來說),我可以一頂三(對於動態庫來說)」。
stl的庫確實是可以一頂二,一頂三。但它這樣做卻破壞了乙個重要的軟體原則:說明和實現分開。說明和實現分開這個原則可以為軟體的公升級和復用帶來很多好處。說明為使用方和提供方之間建立了乙個協議,雙方只要遵守這個協議,提供方就可以很方便的修改實現部分,而不會對使用方新增麻煩。
可以stl卻把說明和實現放到一塊了。這就是說stl中想要改變一下實現,會對使用了stl的使用者帶來非常大的影響。下面我針對這個舉乙個例子。
假設現在我們要做乙個庫(不管是動態庫,還是靜態庫):它的標頭檔案如下:
#ifndef
test_h
#define
test_h
void
output(std::string& arg);
#endif
這個庫的功能很簡單,只向外提供乙個output函式。而這個output函式的用法也很簡單。只有乙個string的引數。寫出這樣乙個簡單的庫,對於任何程式設計師來說都是乙個非常容易的事。可是就是這個簡單的庫裡面卻有一顆定時炸彈。這個炸彈隨時可能**,把使用者的程式炸崩潰。當使用者氣哼哼的找你的時候,你就知道stl把說明和實現放到一塊的壞處了。原來,使用者哪兒的,string和你庫是的string不是乙個版本的。那個炸彈爆了。
這也就是說如果你的程式要和其它的程式以stl的型別交換資料的話,你就要做好連原始碼一起發步出去的準備。且不說把原始碼發步出去帶來的維護上的災難。但就保密問題而言,你的原始碼是能輕易對外發步的嗎?
當然,我們不能因為stl有這個毛病就否定stl的豐功偉績。但stl確實是**復用道路上的一次倒退。我們可以注意到,象loki,boost這些庫,就沒有再用乙個沒任何副檔名的乙個檔案來做一頂二,一頂三這樣的事情。而是使用有了.h(.hpp)這樣的做法。明明確確的告訴使用者這是乙個說明。
也許stl的l就不應該叫做庫。要是非要叫庫的話,應該把它和靜態庫及動態庫區別開來。
STL的L細細品
stl是英文standard template library的簡寫,中文名標準模板庫。我們今天不說它的容器呀,迭代器呀,匹配器呀,演算法呀這些,單說它的library。噢library呀!庫嘛。我哪個六歲半的學習程式設計的小兒子也知道。不就是庫嘛,有什麼好說的。然而,此庫非彼庫。stl的l雖然也是...
STL的L細細品
stl是英文standard template library的簡寫,中文名標準模板庫。我們今天不說它的容器呀,迭代器呀,匹配器呀,演算法呀這些,單說它的library。噢library呀!庫嘛。我哪個六歲半的學習程式設計的小兒子也知道。不就是庫嘛,有什麼好說的。然而,此庫非彼庫。stl的l雖然也是...
STL的L細細品
stl是英文standard template library的簡寫,中文名標準模板庫。我們今天不說它的容器呀,迭代器呀,匹配器呀,演算法呀這些,單說它的library。噢library呀!庫嘛。我哪個六歲半的學習程式設計的小兒子也知道。不就是庫嘛,有什麼好說的。然而,此庫非彼庫。stl的l雖然也是...