2011-06-01 89 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

这意味着所有的代码都在头文件中;没有与库相关联的库 。这意味着在实践中 在最糟糕的情况下取决于—,这意味着作者甚至从未编译过代码:-) 。最有可能的是,这意味着代码永远不会使用编译器,版本和选项 的确切组合进行测试,并且编译时间将会快速增长。在另一个 手中,这意味着即使作者没有 可以访问与您相同的编译器,您也可以使用该库,并且在编译该库时无需使用任何选项即可使用 。或者,如果它是开源的,您不必自己构建库 。