望着這個項目(http://www.savarese.com/software/libssrckdtree/)我發現定義中的「C++頭只模板庫」。目前,我有基本的C++知識,但想知道這是什麼確切指的是,爲什麼這個人使用它在這個項目上C++頭只模板庫
C++頭只模板庫
回答
這意味着模板(函數模板或類模板)的所有定義都僅在頭。沒有.cpp
文件。只有.h
文件(或一些其他的擴展,例如.hpp
或根本沒有擴展名的喜歡<vector>
,string>
等)
C++編譯器需要存在於其中,他們宣稱同一文件的模板定義。因此,只有標題的庫不是靜態庫或動態庫。它的源代碼庫,這意味着你可以在標題中看到實現。您已將代碼中的頭文件包含在頭文件中,該頭文件將與庫中的頭文件一起編譯。
請注意,使用模板(如<vector>
,string>
,<map>
等)的C++標準庫的一部分是僅包含標頭的庫。
其實模板(類模板和函數模板)不能被編譯成靜態或動態庫鏈接到程序。正如該術語本身所言,模板是一個模板;這不是正常的代碼;它只有當你用它在你的代碼通過模板參數(S)(這是可以type
或value
),編譯器生成一個編譯函數/類出函數/類模板:
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
庫提供完整的源代碼。同樣
一些圖書館帶你必須用你的項目鏈接的二進制文件的形式,用頭一起定義可用類或函數的文件。 「只有標題的庫」應該不包含二進制文件,只是包含在源代碼中的標題。
模板是類或定製其特定用途的功能;它們通常在頭文件中定義,因爲編譯器必須讀取它們的源以定製它們。除非您確切知道將如何使用模板,否則無法將模板編譯爲二進制文件,因此您需要將源代碼與自己的代碼一起包含,然後編譯器可以將它們一起處理。
這意味着,有在庫中沒有模塊,僅標頭。這意味着圖書館可以在不需要首先編譯和後來鏈接的情況下使用;只需將頭文件包含在您自己的源代碼模塊中。
這種方法的好處是
- 它更容易有,因爲你並不需要在你的編譯系統來指定鏈接器選項。
- 由於庫的函數在代碼中內聯,因此您總是使用與其餘代碼相同的編譯器(選項)編譯所有庫代碼。
- 它可能會快很多。
在這種情況下,容器數據結構實現模板化它包含的數據類型,所以它不能被完全編譯。
對於模板庫,可以在頭文件(.h文件)中提供所有功能,因爲傳統編譯器需要模板類的完整定義才能爲給定類型實例化。除非庫提供預先實例化的版本,或者模板庫的某些部分不需要模板化,否則沒有必要放入庫中。
它只是「header only」,因爲它不包含單獨的.cpp文件,只有.h文件,因此您可以將所有庫代碼都寫入代碼中。
這可能是有利的,因爲您不必鏈接到靜態庫which can be very painful。
這意味着您不必在開發的鏈接階段鏈接任何外部庫。您只需下載庫並使用#include宏來使用庫。它簡化了應用程序的部署,但有時候會犧牲更長的編譯時間。
這恰好意味着庫僅作爲標題被重新分配。 要使用它,你只需要#include在你的源文件中。
簡短的回答是模板非常像編譯器生成代碼的宏。每次實例化它(例如,使用類型如std::list<int>
)時,編譯器必須具有原始代碼才能在模板類的代碼中插入正確的類型(本例中爲int
)。這就是爲什麼每次需要在.cpp
文件中使用它們時,模板類都包含在.h
文件中。
這意味着所有的代碼都在頭文件中;沒有與庫相關聯的庫 。這意味着在實踐中 在最糟糕的情況下取決於—,這意味着作者甚至從未編譯過代碼:-) 。最有可能的是,這意味着代碼永遠不會使用編譯器,版本和選項 的確切組合進行測試,並且編譯時間將會快速增長。在另一個 手中,這意味着即使作者沒有 可以訪問與您相同的編譯器,您也可以使用該庫,並且在編譯該庫時無需使用任何選項即可使用 。或者,如果它是開源的,您不必自己構建庫 。
- 1. C++頭文件模板
- 2. C++模板和頭文件
- 3. C++模板庫類
- 4. 將C++頭僅模板編譯爲共享庫
- 5. C++內聯函數和只在頭庫
- 6. 頭文件中的C++模板
- 7. C++模板:頭文件仍然破碎?
- 8. VS2008 C++頭文件和類模板
- 9. C++模板和靜態成員 - 在頭
- 10. C++模板模板
- 11. 模板招在頭
- 12. 頭文件模板
- 13. 程序「頭模板」
- 14. C++:只有子類的模板
- 15. C++鏈接錯誤的模板,只使用頭文件,爲什麼?
- 16. C++模板模板(雙模板?)
- 17. 將僅頭文件模板庫編譯爲共享庫?
- 18. C++,模板模板規範
- 19. 模板的模板C++
- 20. 模板模板C++函數
- 21. C++標準庫中的模板模板參數?
- 22. C++標準模板庫矢量問題
- 23. 模板方法在C++靜態庫
- 24. 引導模板頭動畫
- 25. 模板頭標記HTML * EAN
- 26. 「開頭」,在枝條模板
- 27. 包括模板頭文件
- 28. XCode 6.1 - 丟失項目模板(C++庫和C++ STL庫)
- 29. CodeIgniter模板庫
- 30. TYPO3模板庫
或'.hpp'或者'.hxx',或者別的東西;) – 2011-06-01 12:04:51
@VJo:正確。 :-) – Nawaz 2011-06-01 12:09:57
並且在執行速度,代碼清晰度,組織等方面是否有任何優勢? – flow 2011-06-01 12:12:53