« Programmation C++/Le préprocesseur » : différence entre les versions

Contenu supprimé Contenu ajouté
Tchai (discussion | contributions)
Ligne 111 :
Imaginons qu'un fichier header '''toto.h''' contienne le prototype d'une certaine classe ou d'une fonction. Imaginons que le programme contiennent 3 autres fichiers headers nommés A.h, B.h et C.h qui ont tous les 3 besoin des prototypes inclus dans toto.h, ces 3 fichiers vont commencer par ''#include"toto.h"''. Imaginons également que C.h a besoin des prototypes inclus dans A.h et B.h. C.h va donc commence par ''#include"A.h"'' et ''#include"B.h"''. Le problème est que le fichier ''toto.h'' va être inclus plusieurs fois. Le compilateur va alors refuser de compiler le programme en indiquant que plusieurs prototypes d'une même fonction sont inclus.<br/>
'''Solution : ''' <br/>
Pour résoudre l'inclusion multiple de fichier headers (inévitable), on va faire commencer le fichier header par ''#ifndef TOTO_H ''et il se termine par ''#endif''. Si la variable de compilation ''TOTO_H'' n'est pas définidéfinie, alors le header sera inclus, sinon, il sera tout simplement vide. Juste après ''#ifndef TOTO_H'', nous allons écrire #define ''TOTO_H'' définissant justement cette variable de compilation ''TOTO_H''.
 
La première fois que le header sera inclus, ''TOTO_H'' n'est pas défini, le header normal sera donc inclus. ''#define TOTO_H'' définira alors la variable de compilation ''TOTO_H''. La deuxième fois que ce même header sera inclus, et les fois suivantes, ''TOTO_H'' sera défini et par conséquent, le header sera vide. les prototypes n'auront donc été inclus qu'une seule fois. Le tour est joué. Il faut donc faire commencer systèmatiquement (c'est tout du moins conseillé) tous les fichiers header par les 2 lignes ''#ifndef ...'' et ''#define ...'' et les faire se terminer par ''#endif''.