5. Les modules Découpage d’une application en modules 8 décembre 2018 5. Les modules Découpage d’une application en modules Les inclusions multiples L’inclusion circulaire Joan S. Morales - Introduction à l'algo. et la programmation
Le découpage d’une application en modules Après avoir découpé l’application en sous-programmes, on regroupe les sous-programmes qui ont un lien entre eux dans un module Un module est composé d’un fichier .cpp et d’un fichier .h (.h pour header, en-tête) Les prototypes et constantes sont placés dans le .h et les définitions dans le .cpp Si un fichier a besoin d’utiliser une constante ou un sous-programme, il doit inclure le .h correspondant avec #include Joan S. Morales - Introduction à l'algo. et la programmation
Le découpage d’une application en modules (suite) Un projet ne doit contenir qu’un seul programme principal (main) Exemples de modules: sdlclg.cpp et sdlclg.h cmath (*) iostream (*) string (*) (*) Les modules dont on veut garder le code source secret sont plutôt distribués sous la forme de fichiers d’en-têtes et de fichiers .lib. Joan S. Morales - Introduction à l'algo. et la programmation
Avant le découpage Joan S. Morales - Introduction à l'algo. et la programmation
Après le découpage Joan S. Morales - Introduction à l'algo. et la programmation
#include"" ou #include<> ? Les fichiers entourés des symboles < et > sont présumés se trouver dans les répertoires définis dans les paramètres du projet, alors que ceux entourés de guillemets sont présumés se trouver dans le même répertoire que le fichier qui effectue le #include On peut utiliser des chemins relatifs (#include "../sdlclg.h" ), jamais de chemins absolus! Joan S. Morales - Introduction à l'algo. et la programmation
Les inclusions multiples a.h: #include "b.h“ const int A = Nb * 10; b.h: const int Nb = 2; a.cpp: #include "a.h" #include "b.h" int main() { // ... } b.h(1): error C2374: ‘Nb' : redéfinition; initialisation multiple Joan S. Morales - Introduction à l'algo. et la programmation
La solution (*) Pour tous les fichiers d’en-têtes (.h), on ajoute au tout début du fichier: #ifndef NOM_DU_FICHIER_H #define NOM_DU_FICHIER_H Et à la toute fin du fichier: #endif (*) Cette solution est générale et fonctionne pour tous les compilateurs. Avec le compilateur de MS Visual Studio, on peut utiliser simplement #pragma once en tête du fichier. Joan S. Morales - Introduction à l'algo. et la programmation
Le pré-processeur en action... #ifndef A_H const int A = Nb * 10; #endif Le pré-processeur en action... Vrai #define A_H #ifndef B_H #endif Vrai #include "b.h" #define B_H const int Nb = 2; #include "a.h" #ifndef B_H #endif Faux #define B_H const int Nb = 2; #include "b.h" int main() { // ... } Joan S. Morales - Introduction à l'algo. et la programmation
L’inclusion circulaire a.h: #include "b.h" const int A = 2*B; b.h: #include "a.h" const int B = 2*A; b.h(1): error C1014: fichiers Include trop nombreux : profondeur = 1024 Joan S. Morales - Introduction à l'algo. et la programmation
Les bonnes pratiques... Inclure seulement les fichiers d’en-têtes vraiment nécessaires dans les .h Inclure seulement les fichiers d’en-têtes vraiment nécessaires dans les .cpp Portez attention à la structure de votre programme pour éviter les inclusions circulaires Ne jamais inclure de fichier .cpp!!! Ne jamais utiliser de chemins absolus pour inclure un .h Joan S. Morales - Introduction à l'algo. et la programmation