2011-06-01 71 views
8

望着這個項目(http://www.savarese.com/software/libssrckdtree/)我發現定義中的「C++頭只模板庫」。目前,我有基本的C++知識,但想知道這是什麼確切指的是,爲什麼這個人使用它在這個項目上C++頭只模板庫

回答

11

這意味着模板(函數模板或類模板)的所有定義都僅在頭。沒有.cpp文件。只有.h文件(或一些其他的擴展,例如.hpp或根本沒有擴展名的喜歡<vector>string>等)

C++編譯器需要存在於其中,他們宣稱同一文件的模板定義。因此,只有標題的庫不是靜態庫或動態庫。它的源代碼庫,這意味着你可以在標題中看到實現。您已將代碼中的頭文件包含在頭文件中,該頭文件將與庫中的頭文件一起編譯。

請注意,使用模板(如<vector>,string>,<map>等)的C++標準庫的一部分是僅包含標頭的庫。

其實模板(類模板和函數模板)不能被編譯成靜態或動態庫鏈接到程序。正如該術語本身所言,模板是一個模板;這不是正常的代碼;它只有當你用它在你的代碼通過模板參數(S)(這是可以typevalue),編譯器生成一個編譯函數/類出函數/類模板:

template<typename T> 
struct A 
{ 
    T data; 
}; 

struct B 
{ 
    int data; 
}; 

這裏,A不能編譯成二進制(靜態庫或動態庫),因爲編譯器不知道什麼是T。但B可以編譯爲二進制文件,因爲編譯器具有關於它的完整信息。

所以你可以閱讀短語「class template A」 as:A是一個類的模板。 A本身不是一類。但B是一類,它不是模板。

由於無法將類模板A編譯爲靜態或動態庫來鏈接到您的程序,所以A只能作爲header-only庫提供完整的源代碼。同樣

+0

或'.hpp'或者'.hxx',或者別的東西;) – 2011-06-01 12:04:51

+0

@VJo:正確。 :-) – Nawaz 2011-06-01 12:09:57

+0

並且在執行速度,代碼清晰度,組織等方面是否有任何優勢? – flow 2011-06-01 12:12:53

4

一些圖書館帶你必須用你的項目鏈接的二進制文件的形式,用頭一起定義可用類或函數的文件。 「只有標題的庫」應該不包含二進制文件,只是包含在源代碼中的標題。

模板是類或定製其特定用途的功能;它們通常在頭文件中定義,因爲編譯器必須讀取它們的源以定製它們。除非您確切知道將如何使用模板,否則無法將模板編譯爲二進制文件,因此您需要將源代碼與自己的代碼一起包含,然後編譯器可以將它們一起處理。

0

這意味着,有在庫中沒有模塊,僅標頭。這意味着圖書館可以在不需要首先編譯和後來鏈接的情況下使用;只需將頭文件包含在您自己的源代碼模塊中。

這種方法的好處是

  1. 它更容易有,因爲你並不需要在你的編譯系統來指定鏈接器選項。
  2. 由於庫的函數在代碼中內聯,因此您總是使用與其餘代碼相同的編譯器(選項)編譯所有庫代碼。
  3. 它可能會快很多。

在這種情況下,容器數據結構實現模板化它包含的數據類型,所以它不能被完全編譯。

0

對於模板庫,可以在頭文件(.h文件)中提供所有功能,因爲傳統編譯器需要模板類的完整定義才能爲給定類型實例化。除非庫提供預先實例化的版本,或者模板庫的某些部分不需要模板化,否則沒有必要放入庫中。

0

它只是「header only」,因爲它不包含單獨的.cpp文件,只有.h文件,因此您可以將所有庫代碼都寫入代碼中。

這可能是有利的,因爲您不必鏈接到靜態庫which can be very painful

0

這意味着您不必在開發的鏈接階段鏈接任何外部庫。您只需下載庫並使用#include宏來使用庫。它簡化了應用程序的部署,但有時候會犧牲更長的編譯時間。

3

這恰好意味着庫僅作爲標題被重新分配。 要使用它,你只需要#include在你的源文件中。

1

簡短的回答是模板非常像編譯器生成代碼的宏。每次實例化它(例如,使用類型如std::list<int>)時,編譯器必須具有原始代碼才能在模板類的代碼中插入正確的類型(本例中爲int)。這就是爲什麼每次需要在.cpp文件中使用它們時,模板類都包含在.h文件中。

1

這意味着所有的代碼都在頭文件中;沒有與庫相關聯的庫 。這意味着在實踐中 在最糟糕的情況下取決於—,這意味着作者甚至從未編譯過代碼:-) 。最有可能的是,這意味着代碼永遠不會使用編譯器,版本和選項 的確切組合進行測試,並且編譯時間將會快速增長。在另一個 手中,這意味着即使作者沒有 可以訪問與您相同的編譯器,您也可以使用該庫,並且在編譯該庫時無需使用任何選項即可使用 。或者,如果它是開源的,您不必自己構建庫 。