Boost 是一個功能強大、構造精巧、跨平臺、開源并且完全免費的C 程序庫,有著C 準標準庫的美譽。Boost 由C 標準委員會部分成員所設立的Boost 社區開發并維護,使用了許多現代C 編程技術,內容涵蓋字符串處理、正則表達式、容器與數據結構、并發編程、函數式編程、泛型編程、設計模式實現等許多領域,極大地豐富了C 的功能和表現力,能夠使C 軟件開發更加簡捷、優雅、靈活和高效。本書基于2017 年4 月發布的Boost1.64 版,介紹了其中的所有140 余個庫,并且結合C 11/14/17標準詳細、深入地講解了其中數十個庫,同時實現了若干頗具實用價值的工具類和函數,可幫助讀者迅速地理解、掌握Boost 的用法并應用于實際的開發工作。本書內容豐富、結構嚴謹、詳略得當、講解透徹,帶領讀者領略了C 的*前沿技術,相信會是每位C 程序員的必備工具書。
推薦序
最近一年我電話面試了數十位C 應聘者,慣用的暖場問題是工作中使用過STL 的哪些組件?用過Boost 的哪些組件?得到的答案大多集中在vector、map 和shared_ptr。如果對方是在校學生,我一般會問問vector 或map 的內部實現、各種操作的復雜度,以及迭代器失效的可能場景。如果是有經驗的程序員,我還會追問shared_ptr 的線程安全性、循環引用的后果及如何避免、weak_ptr 的作用等。如果這些都回答得不錯,進一步還可以問問如何實現線程安全的引用計數,如何定制刪除動作等。這些問題讓我能迅速地判別對方的C 水平。我之所以在面試時問到Boost,是因為其中的許多組件確實可以用于編寫可維護的產品代碼。Boost 包含近百個程序庫,其中不乏具有工程實用價值的佳品。每個人口味與技術背景不一樣,對Boost 的取舍也不一樣。就我的個人經驗而言,首先可以使用絕對無害的庫,例如noncopyable、scoped_ptr、static_assert 等,這些庫的學習和使用都比較簡單,容易入手。其次,有些功能自己實現起來并不困難,正好Boost 里提供了現成的代碼,那就不妨一用,比如date_time 和circular_buffer 等。然后,在新項目中,對于消息傳遞和資源管理可以考慮采用更加現代的方式,例如用function/bind 在某些情況下代替虛函數作為庫的回調接口、借助shared_ptr 實現線程安全的對象回調等。這二者會影響整個程序的設計思路與風格,需要通盤考慮,如果正確使用智能指針,在現代C 程序里一般不需要出現delete語句。最后,對某些性能不佳的庫保持警惕,比如lexical_cast。總之,在項目組成員人人都能理解并運用的基礎上,適當引入現成的Boost 組件,以減少重復勞動,提高生產力。Boost 是一個寶庫,其中既有可以直接拿來用的代碼,也有值得借鑒的設計思路。試舉一例:正則表達式庫regex 對線程安全的處理。
早期的 RegEx 類不是線程安全的,它把正則表達式和匹配動作放到了一個類里邊。由于有可變數據,RegEx 的對象不能跨線程使用。如今的RegEx 明確地區分了不可變(immutable)與可變(mutable)的數據,前者可以安全地跨線程共享,后者則不行。比如正則表達式本身(basic_regex)與一次匹配的結果(match_results)是不可變的;而匹配動作本身(match_regex)涉及狀態更新,是可變的,于是用可重入的函數將其封裝起來,不讓這些數據泄露給別的線程。正是由于做了這樣合理的區分,RegEx 在正常使用時就不必加鎖。Donald Knuth 在Coders at Work一書里表達了這樣一個觀點:如果程序員的工作就是擺弄參數去調用現成的庫,而不知道這些庫是如何實現的,那么這份職業就沒啥樂趣可言。換句話說,固然我們強調工作中不要重新發明輪子,但是作為一個合格的程序員,應該具備自制輪子的能力。非不能也,是不為也。
C/C 語言的一大特點是其標準庫可以用語言自身實現。C 標準庫的strlen、strcpy、strcmp 系列函數是教學與練習的好題材,C 標準庫的complex、string、vector 則是類、資源管理、模板編程的絕佳示范。在深入了解STL 的實現之后,運用STL 自然手到擒來,并能自動避免一些錯誤和低效的用法。
對于 Boost 也是如此,為了消除使用時的疑慮,為了用得更順手,有時我們需要適當了解其內部實現,甚至編寫簡化版用做對比驗證。但是由于Boost 代碼用到了日常應用程序開發中不常見的高級語法和技巧,并且為了跨多個平臺和編譯器而大量使用了預處理宏,閱讀Boost 源碼并不輕松愜意,需要下一番工夫。另一方面,如果沉迷于這些有趣的底層細節而忘了原本要解決什么問題,恐怕就舍本逐末了。
Boost 中的很多庫是按泛型編程的范式來設計的,對于熟悉面向對象編程的人而言,或許面臨一個思路的轉變。比如,你得熟悉泛型編程的那套術語,如concept、model、refinement,才容易讀懂Boost.Threads 文檔中關于各種鎖的描述。我想,對于熟悉STL 設計理念的人而言,這不是什么大問題。
在某些領域,Boost 不是唯一的選擇,也不一定是最好的選擇。比如,要生成公式化的源代碼,我會首選用腳本語言寫一小段代碼生成程序,而不用Boost.Preprocessor;要在C 程序中嵌入領域特定語言,我會首選用Lua 或其他語言解釋器,而不用Boost.Proto;要用C 程序解析上下文無關文法,我會首選用ANTLR 來定義詞法與語法規則并生成解析器(parser),而不用Boost.Spirit。總之,使用Boost 時心態要平和,別較勁去改造C 語言。把它有助于提高生產力的那部分功能充分發揮出來,讓項目從中受益才是關鍵。
要學習 Boost,除了閱讀其官方網站的文檔、示例與源碼外,最好能有一本比較全面的中文書在手邊隨時翻閱。對于不諳英文的開發者,這更是可幸之至。您手上這本《Boost 程序庫完全開發指南》是很好的使用指南與參考手冊。作者由淺入深地介紹了Boost 的大部分常用內容,能讓讀者迅速了解Boost,并從中找到自己需要的部分。拿到這本書稿之后,我有粗有細地閱讀了一遍,總體來看,作者水平很高,也相當務實,對C 和Boost 的理解與運用很到位,我從這本書學到了不少新知識。為此,我樂于向希望學習Boost 程序庫的開發者推薦這本靠譜的書。
須知功不唐捐,作為一名現代C 程序員,在Boost 上投入的精力定能獲得回報。
陳碩
《代碼大全》譯者之一
中國·香港
第4 版前言
本書初版面市至今已過去了七年的時間,這些年里我一直在持續關注 Boost/C 的發展和動態,及時更新維護這本書已經成為了我的一種習慣甚至是一種生活方式。隨著C 17的發布,編寫新版的工作也就自然而然地提上了日程。
這次修訂的過程也是對自己的一個反省:感覺前幾版有點貪大求全,做的是加法,恨不得把Boost/C 相關的所有細節都列出來,未免顯得有些啰唆,所以這次的第4 版就冷靜了些,開始做減法。在修正筆誤、微調代碼格式、更新date_time、test 等庫之外,刪去了幾個實際價值不是很高的組件,例如scoped_array、swap、tokenizer 等,希望精簡后閱讀起來能夠更加順暢,更方便學習研究。
不過也有聲音反映作者對本書的修訂過于武斷任性,覺得刪除的內容看不到了比較可惜。為了彌補新版導致的缺憾,我把之前刪掉的章節都做成了PDF 文件,放到了GitHub 上,感興趣的讀者可以自行下載查閱。
祝您閱讀愉快,愿我們C 20 時再相見!
羅劍鋒
2017 年7 月17 日于
北京 亞運村
Boost 程序庫完全開發指南深入C 準標準庫(第4 版)
VI
第1 版前言
屈指算來,接觸C 語言至今已經有十余個年頭了。回首往事,不禁感慨良多。
緣起
1996 年我上大學最開始學的是Pascal,不得不說,Pascal 嚴謹的程序風格確實很適合作為一門教學語言,然而用于實際開發就不那么合適了(直到出現Delphi)。由于當時學校并未開設C 語言課程,因此在Pascal 課程結束后我就買書自學C/C 語言,并在次年報名計算機軟件專業技術資格和水平考試,靠著一點點編程和考試的天分獲得了高級程序員資質(當年很熱衷考級考證,后來就淡定多了)。雖然有了資格證,但我仍然算是個C 的初學者,對于C 的認識還處于C 的面向過程和簡單的基于對象層次上。
新千年伊始我考入了北京理工大學就讀研究生,因為跟導師做項目開始接觸STL 與C 標準庫,大概是2005 年從1.33 版結識了Boost,這才真正領略了C 的精髓。那段時期Java 和C#正在國內大行其道,C 則勢單力薄,有關STL 和C 標準的技術書籍寥寥無幾,而講解Boost 的書更是為零,故對Boost 的學習基本只能靠自己的摸索與實踐。好在Boost自帶的文檔相當豐富(盡管看全英文的資料十分辛苦),而且源碼也寫得比較清晰規范,在熟悉了STL 的基礎上學習Boost 倒也并不算太難。
但 Boost 的一個最大的特點就是龐大,功能組件眾多,要想把它全部裝進腦子里融會貫通基本上是不可能的,使用時需要經常查閱英文文檔,相當麻煩。因此,在學習的過程中,我逐漸產生了編寫學習筆記的想法。一開始只是一個簡單的純文本文件,記錄了一些使用經驗的片斷,隨著積累不斷增加,純文本形式已經不能滿足知識整理的需求了,于是我又把這些文字遷移到了Word 文檔里,把使用經驗分類編目,進行較系統的歸納梳理。慢慢地,這份學習筆記居然有了上萬字的規模,成為了一份很好的Boost 備忘參考,在日常的開發工作中給了我很大的幫助就像《設計模式》一書中所說的那樣,捕獲了很多使用Boost 解決問題的實踐經驗,避免了重復發現。不過,這份資料一直僅限于我個人使用,屬于自娛自樂的作品,從未示人。
時間一晃到了2010 年1 月份的某天夜里,不知道是什么原因我忽然失眠了,躺在床上翻來覆去怎么也睡不著。突然,一個念頭闖入了腦海:把Boost 開發經驗整理出版吧,讓更多人能夠分享這些知識,正所謂獨樂樂,與眾樂樂,孰樂?這個大膽的想法的出現讓我那天的失眠又延長了幾
羅劍鋒(網名Chrono)在1996年就讀于東北財經大學;1997年開始接觸C/C ;1998年參加計算機軟件專業技術資格和水平考試,獲高級程序員資質;2003年畢業于北京理工大學,獲計算機專業碩士學位。主要研究方向為C/C 、設計模式、高性能網絡服務器開發,業余愛好是閱讀、旅游、欣賞音樂和電影。