望着这个项目(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. VS2008 C++头文件和类模板
- 6. C++模板模板
- 7. 程序“头模板”
- 8. 头文件模板
- 9. C++:只有子类的模板
- 10. C++链接错误的模板,只使用头文件,为什么?
- 11. 将仅头文件模板库编译为共享库?
- 12. 模板的模板C++
- 13. 模板模板C++函数
- 14. C++标准库中的模板模板参数?
- 15. C++标准模板库矢量问题
- 16. “开头”,在枝条模板
- 17. 包括模板头文件
- 18. XCode 6.1 - 丢失项目模板(C++库和C++ STL库)
- 19. Wpf模板库
- 20. CodeIgniter模板库
- 21. 评估模板(模板模板参数)的C++模板参数
- 22. 从模板C++
- 23. C++模板类
- 24. ,C++模板:
- 25. 在C++模板
- 26. C++模板
- 27. C++模板类
- 28. C++模板特
- 29. C++模板 - LinkedList
- 30. C++模板类
或'.hpp'或者'.hxx',或者别的东西;) – 2011-06-01 12:04:51
@VJo:正确。 :-) – Nawaz 2011-06-01 12:09:57
并且在执行速度,代码清晰度,组织等方面是否有任何优势? – flow 2011-06-01 12:12:53