Baduit

A young French developper who really likes (modern) C++

About me
01 February 2021

Les bibliothèques "header-only" en C++

by Baduit

C’est quoi ?

Une bibliothèque “header-only” est une bibliothèque dont tout le code source repose uniquement dans des fichiers headers (fichiers en-tête, souvent avec les extensions .h, .hpp voire .hh). Elles sont souvent aussi partagées en un seul fichier contenant tout le code : dans ce cas-là, la bibliothèque est aussi appelée “single-file”. Il y a quelques exemples assez connus de bibliothèques “header-only” comme par exemple nlohmann json. D’autres bibliothèques font le choix d’être également disponibles sous forme d’une bibliothèque “header-only” tel que {fmt}.

Les raisons pour lesquels ce type de bibliothèque existe sont les suivantes :

Les avantages

Les inconvénients

Les mythes

Les bibliothèques “header-only” cassent l’encapsulation car l’utilisateur a accès à toutes les déclarations et définitions de la bibliothèque.

Dans un sens, c’est vrai. Mais il suffit de mettre tout ce qui n’est pas prévu d’être accessible par l’utilisateur dans des namespaces appropriés, comme par exemple un namespace nommé details ou impl. De cette manière, ils ne seront pas directement visibles par l’utilisateur.

Les définitions de macros qui sont nécessaire à l’implémentation mais qu’on ne veut pas exposer fuitent.

Il suffit d’indéfinir les macros que vous ne souhaitez pas exposer à l’utilisateur avec #undef MY_MACRO.

Il est impossible de gérer les dépendances circulaires.

Tout écrire dans un header n’empêche pas de séparer la déclaration de la définition, comme on le ferait dans un fichier source. La bibliothèque cpp-httplib, par exemple, le fait et a même un script Python pour pouvoir séparer le code en 2 fichiers distincts : un fichier header et un fichier source.

Toutes ces fonctions “inline” vont impacter la rapidité du programme

Le mot-clef inline ne force pas le compilateur à réellement “inline” la fonction. De plus, le fait de rendre “inline” une fonction peut, selon les cas, être positif ou négatif quant aux performances du programme. Sans faire de benchmark, on ne pas être catégorique sur l’effet de cette optimisation.

Devrais-je rendre ma bibliothèque header-only ?

Voici quelques questions qui peuvent vous aider à répondre à cette question :

Il y a aussi bien évidemment, comme évoqué précédemment, la possibilité de proposer une version supplémentaire “header-only” de sa bibliothèque.

Sources

tags: C++