Modules C++20/23 : Faut-il encore utiliser #include en 2026 ?
Si vous avez lu notre chapitre sur la chaîne de compilation, vous savez que le préprocesseur fonctionne par copier-coller textuel : chaque #include est remplacé par le contenu intégral du fichier visé, encore et encore, fichier après fichier, sans aucune mémoire d'un fichier à l'autre. Ce mécanisme a près de cinquante ans. Depuis C++20, il existe une alternative : les modules.
Le problème que les modules cherchent à résoudre
Avec les en-têtes classiques, un même fichier comme <iostream> peut être analysé des dizaines, voire des centaines de fois dans un même projet : une fois par fichier source qui l'inclut, directement ou indirectement. C'est exactement ce qui explique le fichier de 17 000 lignes mentionné dans notre chapitre sur la compilation, pour un simple "hello world". Sur un gros projet, cette redondance pèse lourd sur les temps de build.
Les modules proposent un principe différent : le compilateur analyse une fois le contenu d'un module, produit une représentation binaire intermédiaire (un fichier .pcm chez Clang, .gcm chez GCC), puis réutilise directement cette représentation partout où le module est importé. Plus de copier-coller textuel, plus d'analyse répétée.
À quoi ça ressemble en pratique
Voici le même programme, écrit avec l'approche classique puis avec les modules C++23 :
// Version classique
#include <iostream>
int main() {
std::cout << "hello world" << std::endl;
return 0;
}
// Version avec modules (C++23)
import std;
int main() {
std::println("hello world");
return 0;
}
La directive import std; remplace l'ensemble des en-têtes de la bibliothèque standard. Pour compiler cet exemple avec Clang, il faut d'abord précompiler le module standard, puis compiler votre fichier en pointant vers ce module :
clang++ -std=c++23 -stdlib=libc++ --precompile -o std.pcm std.cppm clang++ -std=c++23 -stdlib=libc++ -fmodule-file=std=std.pcm main.cpp -o demo
Cette étape de précompilation explicite est la principale différence d'usage avec #include, qui ne demandait aucune préparation.
Où en est le support en 2026
Les trois grands compilateurs (GCC, Clang et MSVC) proposent désormais un support de base des modules C++20. Le module standard import std; introduit par C++23 est également disponible chez les trois, mais reste plus récent et moins éprouvé. La situation continue de progresser : les versions encore en aperçu (preview) des compilateurs prennent en charge davantage de fonctionnalités à chaque sortie.
Le point de friction se trouve surtout en dehors du compilateur lui-même : l'intégration aux systèmes de build (CMake nécessite une version récente et une configuration spécifique), le support dans les IDE et les extensions d'éditeur, et l'adoption par les bibliothèques tierces, qui pour la plupart continuent de s'appuyer sur les en-têtes classiques.
Faut-il migrer ?
Les deux approches coexistent aujourd'hui et continueront de coexister pendant plusieurs années. Les en-têtes classiques restent la norme dans l'immense majorité des bases de code existantes et des bibliothèques tierces ; les modules apportent un vrai gain sur les temps de compilation des gros projets, mais demandent un outillage plus récent et plus rigoureux.
Pour un projet qui démarre aujourd'hui avec un compilateur et un système de build à jour, les modules sont une option à considérer. Pour maintenir ou faire évoluer un projet existant, les en-têtes restent généralement le choix le plus simple. Comprendre le fonctionnement du préprocesseur tel que décrit dans notre chapitre sur la compilation reste donc utile dans les deux cas : c'est le mécanisme que les modules cherchent justement à compléter, pas à effacer.
