
FAQ C++Consultez toutes les FAQ
Nombre d'auteurs : 34, nombre de questions : 368, derni�re mise � jour : 14 novembre 2021 Ajouter une question
Cette FAQ a �t� r�alis�e � partir des questions fr�quemment pos�es sur les forums de http://www.developpez.com et de l'exp�rience personnelle des auteurs.
Je tiens � souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne pr�tend pas non plus �tre compl�te. Si vous trouvez une erreur ou si vous souhaitez devenir r�dacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
- Quels fichiers d'en-t�te dois-je inclure ?
- O� dois-je inclure les fichiers d'en-t�te ?
- Dans quel ordre dois-je mettre mes fichiers d'en-t�te ?
- Comment structurer ma classe en un fichier .h et un fichier .cpp ?
- Comment faire avec les templates ?
- Comment v�rifier que mon fichier d'en-t�te peut �tre inclus ind�pendamment de tout autre ?
- Et avec les en-t�tes pr�compil�s ?
Le strict minimum : c'est-�-dire les seuls fichiers d'en-t�te contenant les d�clarations ou d�finitions de ce qui va �tre utilis� et permettant ainsi � la compilation de r�ussir.
Il est pr�f�rable d'avoir des d�clarations anticip�es (forward declaration) dans les fichiers d'en-t�te et d'inclure l'en-t�te de d�claration dans le fichier source. L'objectif � atteindre est que tout fichier d'en-t�te doit pouvoir �tre inclus ind�pendamment des autres et compiler. Ce qui veut dire qu'un fichier d'en-t�te doit contenir le moins de choses possibles.
Code c++ : | S�lectionner tout |
1 2 3 4 | class A { // d�claration de la classe A }; |
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 7 8 | class A; // d�claration anticip�e class B { // d�claration de la classe B // � void do_someting_with_a_A(A const &); }; |
Code c++ : | S�lectionner tout |
1 2 3 | #include "B.h" #include "A.h" // d�finition de B� |
Pour aller plus loin avec les d�clarations anticip�es, jusqu'� pr�sent vous avez l'habitude de d�couper votre code en deux fichiers�: un fichier d'en-t�te MyClass.h pour la d�claration et un fichier d'impl�mentation MyClass.cpp pour la d�finition. Notez qu'on peut associer un troisi�me fichier MyClassFwd.h pour regrouper les d�clarations anticip�es li�es � CMyClass. Ce fichier contient tout naturellement une d�claration anticip�e de la classe�:
Code c++ : | S�lectionner tout |
class CMyClass;
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 | class CMyClass; enum E_options_my_class { // � }; std::ostream& operator << (std::ostream& O, const CMyClass& B); |
Code c++ : | S�lectionner tout |
#include "MyClassFwd.h"
- Le fichier d'en-t�te de la d�claration de la classe ;
- les fichiers standards (STL) ;
- les fichiers d'en-t�te de l'O.S. ;
- les fichiers d'en-t�te des biblioth�ques tierces (boost, xml, wxWidget�) ;
- les fichiers d'en-t�te de mes biblioth�ques externes ;
- les fichiers d'en-t�te de mon projet.
Cet ordre est une proposition parmi d'autres qui ont aussi leur l�gitimit�. Vous pouvez suivre un autre ordre d'inclusion si vous en sentez le besoin compte tenu de vos pratiques habituelles ou du contexte de votre application. En fait, l'id�e ma�tresse est de maintenir une coh�rence sur l'ensemble du projet. Quelle que soit la politique que vous choisissez de mettre en ouvre, utilisez la m�me syst�matiquement dans tous vos fichiers.
Une classe est d�clar�e dans un fichier header (extension .h, .hpp. ou encore .hxx) dont l'inclusion multiple est prot�g�e gr�ce � des directives du pr�processeur :
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 | #ifndef MACLASSE_H #define MACLASSE_H class MaClasse { public: void Fonction(); }; #endif |
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 | #include "maclasse.h" void MaClasse::Fonction() { // impl�mentation de la fonction } |
Certains seront parfois tent�s d'inclure un fichier .cpp : c'est une erreur et cela ne doit jamais �tre fait (il en r�sulterait plusieurs corps pour une m�me fonction, par exemple).
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 7 8 | #include "autreclasse.h" #include "maclasse.h" void AutreClasse::Fonction() { MaClasse M; M.Fonction(); } |

Code c++ : | S�lectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #ifndef MACLASSE_H #define MACLASSE_H class MaClasse { public: void FonctionInline() { // Plac�e dans la d�claration de la classe // cette fonction est consid�r�e en ligne sans // que le mot cl� inline ne figure } }; // Plac�e en dehors de la d�claration de la classe, le mot cl� inline // est indispensable pour ne pas provoquer des d�finitions multiples // de la fonction et donc des erreurs � l'�dition de liens inline void FonctionInline2() { } #endif |
Les templates n�cessitent d'avoir toute la d�finition dans le fichier d'en-t�te. Pour maintenir une politique coh�rente, on peut s�parer la d�claration d'une classe template (.h) et sa d�finition (.tpp). La d�finition est incluse � la fin du fichier de d�claration :
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 7 | template<class T> class TMyTemplateClass { public: void do_something(); }; #include "MyTemplateClass.tpp" |
Code c++ : | S�lectionner tout |
1 2 3 4 5 6 7 | // en-t�te si besoin // d�finition template<class T> void TMyTemplateClass<T>::do_something() { } |
Inclure le fichier en tout premier dans un fichier .cpp. Ce dernier doit compiler sans erreur.
Les en-t�tes pr�compil�s n'offrent malheureusement pas de standard dans leur mise en ouvre. Tous les compilateurs ne les supportent pas, et ceux qui savent les g�rer ne le font pas tous de la m�me fa�on. Est-ce une raison pour les abandonner ? Non. Car ils offrent de vrais avantages en terme de temps de compilation, surtout pour les projets utilisant des biblioth�ques volumineuses ou complexes. La question qui se pose alors est de savoir quoi mettre dans les en-t�tes pr�compil�s ? Il faut garder � l'esprit l'objectif des en-t�tes pr�compil�s : acc�l�rer la compilation. Il faut donc veiller � mettre les fichiers des biblioth�ques externes r�currents dans vos sources ainsi que ceux qui sont susceptibles de provoquer des inclusions en cascade (afxXXX.h avec les MFC, wx.h dans wxWidgets). En revanche ne mettez pas des fichiers d'en-t�tes du projet en cours car ce sont ceux qui sont le plus susceptibles de varier et d�gradent ainsi le temps de compilation en for�ant � tout recompiler.
Il faut �tre vigilant � ne pas transformer le fichier d'en-t�tes pr�compil�s en un fourre-tout contenant tous les fichiers de toutes les biblioth�ques utilis�es dans un projet. Cela rompt le principe qui veut que l'on minimise les d�pendances entre les unit�s de compilation. Identifiez correctement les fichiers cl�s qui sont significatifs dans le temps de compilation de votre projet.
Proposer une nouvelle r�ponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plut�t sur le forum de la rubrique pour �aLes sources pr�sent�es sur cette page sont libres de droits et vous pouvez les utiliser � votre convenance. Par contre, la page de pr�sentation constitue une �uvre intellectuelle prot�g�e par les droits d'auteur. Copyright � 2025 Developpez Developpez LLC. Tous droits r�serv�s Developpez LLC. Aucune reproduction, m�me partielle, ne peut �tre faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'� trois ans de prison et jusqu'� 300 000 � de dommages et int�r�ts.