C, C++, H : différences entre ces fichiers source et d'en-tête
Le C et le C++ sont deux langages distincts malgré leur parenté historique, et le fichier .h joue un rôle à part : ce qui les distingue réellement, et pourquoi ce dernier ne se compile jamais seul.
Le C et le C++ partagent une origine commune mais sont deux langages distincts depuis plus de quatre décennies, tandis que le H n’est ni l’un ni l’autre : c’est un fichier d’en-tête, qui déclare sans jamais constituer un programme complet à lui seul.
| Format | Rôle | Compilable seul | Extensions | Paradigme |
|---|---|---|---|---|
| C | Code source, implémentation | Oui | .c | Procédural |
| C++ | Code source, implémentation | Oui | .cpp, .cc, .cxx | Procédural + orienté objet + génériques |
| H | Déclarations, en-tête | Non (inclus par un .c/.cpp) | .h, .hpp | N/A |
Le C reste, plus de quarante ans après sa description par Kernighan et Ritchie, le langage de référence pour tout ce qui touche de près au matériel ou à un système d’exploitation. Sa première norme officielle, ratifiée par l’ANSI en décembre 1989 puis reprise à l’identique par l’ISO en 1990 (ISO/IEC 9899:1990, couramment appelée C89 ou C90), a figé un socle stable sur lequel s’appuient encore la plupart des noyaux et bibliothèques système actuels.
Le C++, créé par Bjarne Stroustrup chez Bell Labs à partir de 1979 sous le nom provisoire de « C with Classes » avant de prendre son nom actuel en 1983, étend le C avec la programmation orientée objet, les templates et une bibliothèque standard bien plus riche. Un fichier .c ne se compile pas nécessairement tel quel avec un compilateur C++ : la syntaxe C++ a divergé du C sur plusieurs points au fil de ses révisions normatives successives (la première norme ISO complète, C++98, puis les révisions ultérieures), même si l’essentiel du C classique reste généralement compréhensible par un compilateur C++.
Le H (ou .hpp pour une convention plus spécifiquement C++) ne contient en principe que des déclarations (prototypes de fonctions, définitions de types, macros) destinées à être incluses textuellement par le préprocesseur dans un ou plusieurs fichiers .c ou .cpp au moment de la compilation. Il ne produit jamais de binaire par lui-même : un en-tête isolé, sans fichier source qui l’inclut et implémente les fonctions qu’il déclare, ne peut pas être compilé en programme exécutable.
Le choix entre C et C++ dépend donc du besoin de fonctionnalités orientées objet et d’une bibliothèque standard étendue (C++) contre un contrôle plus direct et minimal proche du matériel (C) ; le fichier .h, lui, n’est pas une alternative aux deux, mais une pièce complémentaire indispensable dès qu’un projet dépasse un seul fichier source.
Voir la fiche technique complète →
Formats concernés
Catégories concernées
Questions fréquentes
Pourquoi un fichier .h commence-t-il souvent par #ifndef suivi d'un #define ?
C'est une garde d'inclusion : si le même en-tête est inclus deux fois, le compilateur verrait deux fois les mêmes définitions, par exemple d'une structure, ce qui provoque une erreur. Le #ifndef teste une macro propre au fichier et fait ignorer son contenu dès la deuxième inclusion.
Comment utiliser un en-tête C dans un programme C++ ?
Les déclarations doivent être placées dans un bloc extern "C", qui désactive la décoration des noms (name mangling) propre au C++ pour que l'éditeur de liens retrouve les fonctions compilées en C. Comme extern "C" n'existe pas en C, on l'entoure de #ifdef __cplusplus pour que le même en-tête reste utilisable par les deux langages.
Sources
- Bjarne Stroustrup : FAQ sur l'histoire de C++
- GNU GCC : Standards du langage C et C++ pris en charge
- GNU : The C Preprocessor, Once-Only Headers
- cppreference : Language linkage
Dernière mise à jour :