In the context of the C or C++ programming languages, a library is called header-only if the full definitions of all macros, functions and classes comprising the library are visible to the compiler in a header file form.[1] Header-only libraries do not need to be separately compiled, packaged and installed in order to be used. All that is required is to point the compiler at the ___location of the headers, and then #include the header files into the application source. Another advantage is that the compiler's optimizer can do a much better job when all the library's source code is available.

The disadvantages include:

  • brittleness – most changes to the library will require recompilation of all compilation units using that library,
  • longer compilation times – the compilation unit must see the implementation of all components in the included files, rather than just their interfaces,
  • machine-code bloat (arguably) – the necessary use of inline statements in non-class functions can lead to code bloat by over-inlining,
  • harder to understand as the header contains both the interface and the implementation whereas traditional library separate both.

Nonetheless, the header-only form is popular because it avoids the (often much more serious) problem of packaging.

For C++ templates, including the definitions in header is the only way to compile, since the compiler needs to know the full definition of the templates in order to instantiate.

References

edit
  1. ^ Wilson, Matthew (2004). Imperfect C++. Addison-Wesley. p. 177. ISBN 0-321-22877-4.