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

Contenu supprimé Contenu ajouté
ortho
Ligne 32 :
 
====Exemples====
*'''=====Exemple 1'''<br/>=====
<pre>
#include <iostream>
using namespace std;
#define FRENCH
 
#include <iostream>
int main()
using namespace std;
#ifdefdefine FRENCH
cout<<"BONJOUR";
int main()
#else
{
cout<<"HELLO";
#defineifdef FRENCH
#endif
cout << "BONJOUR";
return 0;
#else
cout << "HELLO";
</pre>
#endif
Dans ce programme, il suffit d'effacer #define FRENCH et de recompiler le programme pour passer d'une version française à une version anglaise. Ceci pourrait être utile si le programme comporte 10 000 lignes (ce qui est faible pour un programme réel). Bien évidemment, il existe bien d'autres façons de gérer le multilinguisme en C++.
return 0;
*'''Exemple 2'''<br/>
}
 
Dans ce programme, il suffit d'effacer <code>#define FRENCH</code> et de recompiler le programme pour passer d'une version française à une version anglaise. Ceci pourrait être utile si le programme comporte 10 000 lignes (ce qui est faible pour un programme réel). Bien évidemment, il existe bien d'autres façons de gérer le multilinguisme en C++.
 
*'''=====Exemple 2'''<br/>=====
'''Fichier toto.h'''<br/>
<pre>
#ifndef TOTO_H
#define TOTO_H
 
#ifndef TOTO_H
... écrire ici les prototypes
#define TOTO_H
''... écrire ici les prototypes''
#endif
 
#endif
</pre>
'''Le problème : ''' <br/>
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 onont tous toutles 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éfini, 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''.
 
=====Autre solution=====
Toutefois, il existe une autre solution au problème précédent en utilisant la directive suivante en début de fichier <code>.h</code> :
#pragma once
Cette directive indique au compilateur d'ignorer le fichier s'il a déjà été "visité", et ne fonctionne qu'avec certains compilateurs :
* Visual C++
* CodeWarrior
* GCC for Darwin
 
=== Les macros===