Bonjour à tous.
Comment résoudre l'éternel problème des .inl ?
Supposons deux classes A et B, templates ayant chacun un .hpp et un .inl
On ne peut inclure A.inl à la fin de A.hpp car A.inl à besoin de B.hpp et que B.hpp doit inclure A.hpp.
On a donc quelque chose comme sa :
A.hpp
B.hpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template<typename T> class B; template<typename T2> class A { private : B*qqch; };
et A.inl
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "A.hpp" template<typename T> class B { }; #include "B.inl"
et B.inl
Code : Sélectionner tout - Visualiser dans une fenêtre à part #include "B.hpp"
main.cpp
Code : Sélectionner tout - Visualiser dans une fenêtre à part //Quelque chose
Ceci marche parfaitement mais oblige l'utilisateur à inclure les .inl "à la main"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 #include "A.hpp" #include "B.hpp" #include "A.inl"//On est obligé de l'inclure à la main int main() { }
Imaginons maintenant un beaucoup plus gros projet. Il faut toujours inclure les .inl à la fin pour la même raison que ci dessus.
On ne souhaite pas être obligé de choisir les .inl à inclure. On préfèrera un système ou l'on inclut inls.hpp après toutes les autres includes dans chaque .cpp
Comment construire inls.hpp :
On pourrait décider d'inclure tous les .inl (auquel cas, il faut inclure aussi tous les .hpp correspondant avant). Ceci est ce que je fais actuellement. Cependant, sa présente un défaut majeur : le temps de compilation. A chaque fois que je modifie un header, tous les .cpp sont recompilés même si ils en n'ont pas réellement besoin (du header modifié).
Une autre solution que j'ai testée consiste à mettre des ifdef pour voir quels .inl je dois inclure. Me manque juste un GOTO préprocesseur pour que sa marche. je vous montre le fichier :
Petit défaut : Application.inl inclut binding.hpp que personne d'autre n'inclut. Conséquence : Binding.inl n'est pas inclut !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 #define __ALLOW_INL_INCLUSION_OK__ #ifdef BINDING_HPP_INCLUDED #include "Binding.inl" #endif #ifdef EVENEMENT_HPP_INCLUDED #include "Event.inl" #endif #ifdef EXCEPTIONS_HPP_INCLUDED #include "Exceptions.inl" #endif #ifdef EMITTABLE_HPP_INCLUDED #include "Emittable.inl" #endif #ifdef RECTANGLE_HPP_INCLUDED #include "Rectangle.inl" #endif #ifdef SORTED_HPP_INCLUDED #include "Sorted.inl" #endif #ifdef APPLICATION_HPP_INCLUDED #include "Application.inl" #endif #ifdef GRAPHICOBJECT_HPP_INCLUDED #include "GraphicObject.inl" #endif #undef __ALLOW_INL_INCLUSION_OK__
Moyen de résolution possible : A chaque fois que j'inclus un .inl, je reprends au départ (début du fichiers inls.hpp).
Manque : Pas de GOTO avec le préprocesseur.
Quelqu'un à une solution ?
Merci.
Partager