# 第?1?章?簡介
### 目錄
* [1.1 C++ 與 Boost](introduction.html#introduction_cpp_and_boost)
* [1.2 開發過程](introduction.html#introduction_development_process)
* [1.3 安裝](introduction.html#introduction_installation)
* [1.4 概述](introduction.html#introduction_overview)
[](http://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.zh) 該書采用 [Creative Commons License](http://creativecommons.org/licenses/by-nc-nd/3.0/de/deed.zh) 授權
## 1.1.?C++ 與 Boost
[Boost C++ 庫](http://www.boost.org/doc/libs/) 是一組基于C++標準的現代庫。 其源碼按 [Boost Software License](http://www.boost.org/LICENSE_1_0.txt) 來發布,允許任何人自由地使用、修改和分發。 這些庫是平臺獨立的,且支持大多數知名和不那么知名的編譯器。
Boost 社區負責開發和發布 Boost C++ 庫。 社區由一個很大的C++開發人員群組組成,這些開發人員來自于全球,他們通過網站 [www.boost.org](http://www.boost.org/) 以及幾個郵件列表相互協調。 社區的使命是開發和收集高質量的庫,作為C++標準的補充。 那些被證實有價值且對于C++應用開發非常重要的庫,將會有很大機會在某天被納入C++標準中。
Boost 社區在1998年左右出現,當時剛剛發布了C++標準的第一個版本。 從那時起,社區就不斷地擴大,現在已成為C++標準化工作中的一個重要角色。 雖然 Boost 社區與標準化委員會之間沒有直接的關系,但有部分開發者同時活躍于兩方。 下一個版本的C++標準很大可能在2011年通過,其中將擴展一批庫,這些庫均起源于 Boost 社區。
要增強C++項目的生產力,除了C++標準以外,Boost C++ 庫是一個不錯的選擇。 由于當前版本的C++標準在2003年修訂之后,C++又有了新的發展,所以 Boost C++ 庫提供了許多新的特性。 由于有了 Boost C++ 庫,我們無需等待下一個版本的C++標準,就可以立即享用C++演化中取得的最新進展。
Boost C++ 庫具有良好的聲譽,這基于它們的使用已被證實是非常有價值的。 在面試中詢問關于 Boost C++ 庫的知識是不常見的,因為知道這些庫的開發人員通常也清楚C++的最新創新,并且能夠編寫和理解現代的C++代碼。
## 1.2.?開發過程
正是因為大量的獨立開發者和組織的支持和參與,才使用 Boost C++ 庫的開發成為可能。 由于 Boost 只接受滿足以下條件的庫:解決了真實存在的問題、表現出令人信服的設計、使用現代C++來開發且以可理解的方式提供文檔,所以每一個 Boost C++ 庫的背后都有大量的工作。
C++ 開發者都可以加入到 Boost 社區中,并提出自己的新庫。 但是,要將一個想法變成一個 Boost C++ 庫,需要投入大量的時間和努力。 其中最重要的是在 Boost 郵件列表中與其他開發者及潛在用戶討論需求和可能的解決方案。
除了這些好象不知從何處冒出來的新庫以外,也可以提名一些已有的 C++ 庫進入 Boost。 不過,由于對這些庫的要求是與專門為 Boost 開發的庫一樣的,所以可能需要對它們進行大量的修改。
一個庫是否被接納入 Boost,取決于評審過程的結果。 庫的開發者可以申請評審,這通常需要10天的時間。 在這段時間內,其他開發者被邀請對這個庫進行評分。 基于正面和負面評價的數量,評審經理將決定該庫是否被接納進入 Boost。 由于有些開發者是在評審階段才首次公開庫的代碼,所以在評審期間被要求對庫進行修改并不罕見。
如果一個庫是因為技術原因被拒絕,那么它還有可能在修改之后對更新后的版本申請新的評審。 但是,如果一個庫是因為不能解決實際問題或未能提供令人信服的解決方案而被拒絕,那么再一次評審也很可能會被拒絕。
因為可能隨時接納新的庫,所以 Boost C++ 庫會每三個月發布一次新版本。本書所涉及的庫均基于2010年2月發布的 1.42.0 版本。
請注意,另外還有一些庫已被接納,但尚未成為 Boost C++ 庫發布版的一部分。在被包含進發布版之前,它們必須手工安裝。
## 1.3.?安裝
Boost C++ 庫均帶有源代碼。其中大多數庫只包含頭文件,可以直接使用,但也有一些庫需要編譯。 為了盡可能容易安裝,可以使用 Boost Jam 進行自動安裝。 無需逐個庫進行檢查和編譯,Boost Jam 自動安裝整個庫集。 它支持許多操作系統和編譯器,并且知道如何基于適當的配置文件來編譯單個庫。
為了在 Boost Jam 的幫助下自動安裝,要使用一個名為 **bjam** 的應用程序,它也帶有源代碼。 對于某些操作系統,包括 Windows 和 Linux,也有預編譯好的 **bjam** 二進制文件。
為了編譯 **bjam** 本身,要執行一個名為 **build** 的簡單腳本,它也為不同的操作系統提供了源代碼。 對于 Windows,它是批處理文件 `build.bat`。 對于 Linux,文件名為 `build.sh`。
如果執行 **build** 時不帶任何命令行選項,則該腳本嘗試找到一個合適的編譯器來生成 **bjam**。 通過使用命令行開關,稱為 toolset,可以選擇特定的編譯器。 對于 Windows,**build** 支持 toolsets `vc7`, `vc8` 和 `vc9`,可以選擇不同版本的 Microsoft C++ 編譯器。 要從 Visual Studio 2008 的C++編譯器編譯 **bjam**,需要指定命令 **build vc9**。對于 Linux,支持 toolsets `gcc` 和 `intel-linux`,分別選定 GCC 和 Intel 的C++編譯器。
應用程序 **bjam** 必須復制到本地的 Boost 目錄 - 不論它是編譯出來的還是下載的預編譯二進制文件。 然后就可以不帶任何命令行選項地執行 **bjam**,編譯并安裝 Boost C++ 庫。 由于缺省選項 - 在這種情況下所使用的 - 并不一定是最好的選擇,所以以下列出最重要的幾個選項供參考:
* 聲明 `stage` 或 `install` 可以指定 Boost C++ 庫是安裝在一個名為 `stage` 的子目錄下,還是在系統范圍內安裝。 "系統范圍"的意義取決于操作系統。 在 Windows 中,目標目錄是 `C:\Boost`;而在 Linux 中則是 `/usr/local`。 目標目錄也可以用 `--prefix` 選項明確指出。
* 如果不帶任何命令行選項執行 **bjam**,則它會自己搜索一個合適的C++編譯器。 可以通過 `--toolset` 選項來指定一個特定的編譯器。 要在 Windows 中指定 Visual Studio 2008 的 Microsoft C++ 編譯器,**bjam** 執行時要帶上 `--toolset=msvc-9.0` 選項。 要在 Linux 中指定 GCC 編譯器,則要給出 `--toolset=gcc` 選項。
* 命令行選項 `--build-type` 決定了創建何種方式的庫。 缺省情況下,該選項設為 `minimal`,即只創建發布版。 對于那些想用 Visual Studio 或 GCC 構建他們項目的調試版的開發者來說,可能是一個問題。 因為這些編譯器會自動嘗試鏈接調試版的 Boost C++ 庫,這樣就會給出一個錯誤信息。 在這種情況下,應將 `--build-type` 選項設為 `complete`,以同時生成 Boost C++ 庫的調試版和發布版,當然,所需時間也會更長一些。
要用 Visual Studio 2008 的C++編譯器同時生成 Boost C++ 庫的調試版和發布版,并將它們安裝在目錄 `D:\Boost` 中,應執行的命令是 **bjam --toolset=msvc-9.0 --build-type=complete --prefix=D:\Boost install**. 要在 Linux 中使用缺省目錄創建它們,則要執行的命令是 **bjam --toolset=gcc --build-type=complete install**.
其它多個命令行選項可用于指定如何編譯 Boost C++ 庫的一些細節設定。 我通常在 Windows 下使用以下命令:**bjam --toolset=msvc-9.0 debug release link=static runtime-link=shared install**. `debug` 和 `release` 使得調試版和發布版均被生成。 `link=static` 則只創建靜態庫。 `runtime-link=shared` 則是指定 C++ 運行時庫是動態鏈接的,這是在 Visual Studio 2008 中對C++項目的缺省設置。
## 1.4.?概述
Boost C++ 庫的 1.42.0 版本包含了超過90個庫,本書只詳細討論了以下各庫:
表?1.1.?討論到的庫
| Boost C++ 庫 | C++ 標準 | 簡要說明 |
| --- | --- | --- |
| [Boost.Any](datastructures.html#datastructures_any "14.3.?Boost.Any") | | Boost.Any 提供了一個名為 `boost::any` 的數據類型,可以存放任意的類型。 例如,一個類型為 `boost::any` 的變量可以先存放一個 `int` 類型的值,然后替換為一個 `std::string` 類型的字符串。 |
| [Boost.Array](containers.html#containers_array "13.2.?Boost.Array") | TR1 | Boost.Array 可以把 C++ 數組視同 C++ 標準的容器。 |
| [Boost.Asio](asio.html "第?7?章?異步輸入輸出") | TR2 | Boost.Asio 可用于開發異步處理數據的應用,如網絡應用。 |
| [Boost.Bimap](containers.html#containers_bimap "13.5.?Boost.Bimap") | | Boost.Bimap 提供了一個名為 `boost::bimap` 的類,它類似于 `std::map`. 主要的差別在于 `boost::bimap` 可以同時從鍵和值進行搜索。 |
| [Boost.Bind](functionobjects.html#functionobjects_bind "3.2.?Boost.Bind") | TR1 | Boost.Bind 是一種適配器,可以將函數作為模板參數,即使該函數的簽名與模板參數不兼容。 |
| [Boost.Conversion](castoperators.html#castoperators_conversion "16.2.?Boost.Conversion") | | Boost.Conversion 提供了三個轉型操作符,分別執行向下轉型、交叉轉型,以及不同數字類型間的值轉換。 |
| [Boost.DateTime](datetime.html "第?10?章?日期與時間") | | Boost.DateTime 可用于以靈活的格式處理、讀入和寫出日期及時間值。 |
| [Boost.Exception](errorhandling.html#errorhandling_exception "15.3.?Boost.Exception") | | Boost.Exception 可以在拋出的異常中加入額外的數據,以便在 `catch` 處理中提供更多的信息。 這有助于更容易地調試,以及對異常情況更好地作出反應。 |
| [Boost.Filesystem](filesystem.html "第?9?章?文件系統") | TR2 | Boost.Filesystem 提供了一個類來處理路徑信息,還包含了幾個訪問文件和目錄的函數。 |
| [Boost.Format](stringhandling.html#stringhandling_format "5.6.?格式化輸出庫 Boost.Format") | | Boost.Format 以一個類型安全且可擴展的 `boost::format` 類替代了 `std::printf()` 函數。 |
| [Boost.Function](functionobjects.html#functionobjects_function "3.4.?Boost.Function") | TR1 | Boost.Function 簡化了函數指針的定義。 |
| [Boost.Interprocess](interprocesscommunication.html "第?8?章?進程間通訊") | | Boost.Interprocess 允許多個應用通過共享內存以快速、高效的方式進行通信。 |
| [Boost.Lambda](functionobjects.html#functionobjects_lambda "3.5.?Boost.Lambda") | | Boost.Lambda 可以定義匿名的函數。 代碼被內聯地聲明和執行,避免了單獨的函數調用。 |
| [Boost.Multiindex](containers.html#containers_multiindex "13.4.?Boost.MultiIndex") | | Boost.Multiindex 定義了一些新的容器,它們可以同時支持多個接口,如 `std::vector` 和 `std::map` 的接口。 |
| [Boost.NumericConversion](castoperators.html#castoperators_numeric_conversion "16.3.?Boost.NumericConversion") | | Boost.NumericConversion 提供了一個轉型操作符,可以安全地在不同的數字類型間進行值轉換,不會生成上溢出或下溢出的條件。 |
| [Boost.PointerContainer](smartpointers.html#smartpointers_pointer_container "2.9.?指針容器") | | Boost.PointerContainer 提供了專門為動態分配對象進行優化的容器。 |
| [Boost.Ref](functionobjects.html#functionobjects_ref "3.3.?Boost.Ref") | TR1 | Boost.Ref 的適配器可以將不可復制對象的引用傳給需要復制的函數。 |
| [Boost.Regex](stringhandling.html#stringhandling_regex "5.4.?正則表達式庫 Boost.Regex") | TR1 | Boost.Regex 提供了通過正則表達式進行文本搜索的函數。 |
| [Boost.Serialization](serialization.html "第?11?章?序列化") | | 通過 Boost.Serialization,對象可以被序列化,如保存在文件中,并在以后重新導入。 |
| [Boost.Signals](eventhandling.html "第?4?章?事件處理") | | Boost.Signal 是一個事件處理的框架,基于所謂的 signal/slot 概念。 函數與信號相關聯并在信號被觸發時自動被調用。 |
| [Boost.SmartPoiners](smartpointers.html "第?2?章?智能指針") | TR1 | Boost.SmartPoiners 提供了多個智能指針,簡化了動態分配對象的管理。 |
| [Boost.Spirit](parser.html "第?12?章?詞法分析器") | | Boost.Spirit 可以用類似于 EBNF (擴展巴科斯范式)的語法生成詞法分析器。 |
| [Boost.StringAlgorithms](stringhandling.html#stringhandling_stringalgorithms "5.3.?字符串算法庫 Boost.StringAlgorithms") | | Boost.StringAlgorithms 提供了多個獨立的函數,以方便處理字符串。 |
| [Boost.System](errorhandling.html#errorhandling_system "15.2.?Boost.System") | TR2 | Boost.System 提供了一個處理系統相關或應用相關錯誤代碼的框架。 |
| [Boost.Thread](multithreading.html "第?6?章?多線程") | C++0x | Boost.Thread 可用于開發多線程應用。 |
| [Boost.Tokenizer](stringhandling.html#stringhandling_tokenizer "5.5.?詞匯分割器庫 Boost.Tokenizer") | | Boost.Tokenizer 可以對一個字符串的各個組件進行迭代。 |
| [Boost.Tuple](datastructures.html#datastructures_tuple "14.2.?元組") | TR1 | Boost.Tuple 提供了泛化版的 `std::pair`,可以將任意數量的數據組在一起。 |
| [Boost.Unordered](containers.html#containers_unordered "13.3.?Boost.Unordered") | TR1 | Boost.Unordered 擴展了 C++ 標準的容器,增加了`boost::unordered_set` 和 `boost::unordered_map`. |
| [Boost.Variant](datastructures.html#datastructures_variant "14.4.?Boost.Variant") | | Boost.Variant 可以定義多個數據類型,類似于 `union`, 將多個數據類型組在一起。 Boost.Variant 比 `union` 優勝的地方在于它可以使用類。 |
Technical Report 1 是在2003年發布的,有關 C++0x 標準和 Technical Report 2 的一些細節才能反映當前的狀態。由于無論是下一個版本的 C++ 標準,還是 Technical Report 2 都尚未被批準,所以在往后的時間里,它們仍然可能會有改變。