slt tlm ![]()
en fait j´aimerais savoir comment on utilise les #ifndef svp :o .
j´ai recherché sur google, mais je trouve la syntaxe bizarre avec des _BLABLA_ et je comprends pas trop comment on utilise ça..
merci
C´est très simple :
Si dans un programme tu as écrit :
et plus loin :
. ..
Alors la partie du code se trouvant entre #ifndef et #end ne s´exécutera pas car HELLO à été défini.
Si tu supprime " #define HELLO", alors le bloc sera exécuté.
( ifndef : si non défini )
A quoi ca sert ?
A éviter les inclusions circulaires de fichiers . h sur certains compilateurs " bas de gamme" et à d´autres choses.
C´est pour ca qu´il est conséillé, quand tu crée un fichier . h de commencer par :
et de finir par
Je ne sais pas si tu comprend " inclusions circulaires", mais utilise cette méthode...
C´est aussi l´opposé de #ifdef ( si défini ) .
ATTENTION : il s´agit d´une directive de préprocesseur, donc ca ne marche qu´avec les #define, et pas avec les variable : un int HELLO; est inutile...
merci de m´avoir répondu si vite, je comprends à quoi ils servent et j´en ai grandement besoin.
mais peux-tu m´expliquer comment inclure un fichier.h ?
j´ai vu qu´on devait noter _fichier_h mais j´en suis pas sûr.. et si c´est le cas, pourquoi on doit mettre des _ lol^^ ?
merci encore
Il faudrait que tu précises un petit peu plus dans quel but tu désirerais l´utiliser ; ) Ca sert en fait à modifier la façon de compiler un programme selon des paramètres en amont ( oui, ça fait compliqué écrit comme ça).
Par exemple, si tu crées un jeu qui peut se jouer en fenêtre ou en fullscreen et qu´il soit nécessaire de modifier directement le programme pour changer le mode ( ça arrive avec la SDL), tu peux mettre:
-- suite de commande en C spécifique au fullscreen.
Au début de ton code, si tu mets:
la compilation va s´effectuer en utilisant la suite de commande après le ifdef. Par contre, si FULLSCREEN n´est pas défini, cette suite de commande ne sera pas prise en compte lors de la compilation.
ifndef est également fréquemment utilisé lors d´inclusions croisées de fichier . h ( c´était peut-être ce dont tu voulais parler ? ) .
oui mathrim, en fait j´ai plusieurs headers et c´est le bordel car je dois partout mettre #include " truc.h"
or au linkage il me dit que j´ai fait plusieurs #include " truc.h" ( ce qui est logique et que je comprends parfaitement).. le poblème, c´est que je peux pas faire autrement et il faudrait que j´utilise #ifndef
Si tu as un fichier MyFile.h, tu dois écrire:
code
Ainsi, lorsque tu fais un include, si c´est la première fois que le compilateur le rencontre, _MyFile_ n´est pas défini, et le fichier est lu intégralement. La seconde fois qu´il le rencontre, _MyFile_ aura été défini, et il n´y aura plus rien ( aux yeux du compilateur) dans le fichier, donc plus de problèmes de compil ; )
Le choix de variable _MyFile_ est surtout fait pour éviter que tu ne choisisses deux fois la même variable, ou que tu ne choisisses une variable déjà existante.
ah ok, c´était tip top ce qu´il me fallait, merci beaucoup ! ![]()
ah, une dernière question..
pourquoi doit-on faire un #define _fichier_H ?
lol, j´ai mis ça dans un header:
mais euh, ça marche pas ^^
Je crois que tu n´as pas vraiment compris.
Là, tu devrais faire, si ton fichier s´appelle sprite.h ( par exemple):
tout le code
ah ok lol thx
mais ca veut dire alors que je dois faire dans tous les fichiers #define _SPRITE_ ?
Non, seulement dans le fichier sprite.h
Tu ne fais un #ifndef / #define qu´une seule fois par fichier.
ok thx
.
erf j´ai encore un problème
dans un fichier functions.cpp qui est linké lors de la compilation, j´ai toute les fonctions qui sont écrites, hors pour que le fichier marche, j´ai besoin de déclarer certaines variables ( comme des SDL_Surface* etc..).
le problème c´est que je dois aussi déclarer ces meme variables dans le fichier main.cpp, et bien sûr, il veut pas puisque j´ai déclarer plusieurs fois les meme variables, vous suivez ?
qqun a une solution ?
oula
Bon tout d´abord les define n´ont rien à voir avec les includes . .. C´est juste une utilisation parmi tant d´autres.
Le principe des headers est que pour éviter les inclusions répétées tu indiques au préprocesseur que tu le déclares une seule fois.
Pour reprendre les exemples cités au dessus : lorsque tu as un fichier source " sprite.cpp" et son header " sprite.h", tu écris ton header comme ceci, sprite.h :
/ / et là tu mets le reste de ton . h
Tu peux écrire _SPRITE_H ou tout autre nom composé de _ [A-Z] [a-z] [0-9] ( dans ce que tu as écris le caractère / n´est pas autorisé)
Pour éviter les conflits de nom on donne généralement le nom du fichier convertit en symbole précédé du caractère _ ( sprite.h -> _SPRITE_H ou _SPRITE_HEADER ou _SPRITE_INCLUDE ou ce que tu veux). Mais ce n´est qu´une convention et pas du tout une obligation!
Mais plus généralement tu peux déclarer des symboles pour d´autres trucs :
- isoler une porition de code pour éviter de la compiler sans avoir à la commenter ou la supprimer
- définir des portions de codes qui seront compilées que dans une certaines configuration ( en version debug ou release)
/ / afficher des infos pour débugger ton code
/ / le contenu d´une variable
/ / etc...
- idem pour une version démo
. ..
/ / code pour la sauvegarde par exemple
/ / donc en version démo cette partie du code
/ / ne sera pas compilée
/ / afficher " Sauvegarde impossible en version démo"
- définir des constantes si elles n´existent pas déjà :
- etc...
hmm faut surtout pas déclarer plusieurs fois la même variable !
Tu déclares une fois pour toute la variable ( où tu voudras) et tu y feras référence ailleurs ( si c´est dans un autre . cpp) via le mot clé extern :
fichier1.cpp:
SDL_Surface *pSurface;
-------------
fichier1.h:
extern SDL_Surface *pSurface;
-------------
fichier2.cpp:
" include " fichier1.h"
ah ok merci beaucoup ! !
donc je dois rajouter partout extern devant mes variables dans le functions.cpp à linker ?
je vais essayer, encore merci
ouaaah super ca s´est compilé :D
mais bon j´ai quand même un seg fault donc je vais vérifier mes fonctions ^^
non pas partout ! seulement celles que tu veux exporter vers d´autres modules
( faut éviter d´utiliser trop de variables globales car c´est pas propre et source de problèmes)