CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

C++ : #ifndef => HELP PLZ ^^

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:05:54

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

lag-it
lag-it
Niveau 10
23 avril 2004 à 18:12:32

C´est très simple :

Si dans un programme tu as écrit :

  1. define HELLO

et plus loin :

  1. ifndef HELLO

. ..

  1. endif

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 :

  1. ifndef NOM_DU_FICHIER_H
  2. define NOM_DU_FICHIER_H

et de finir par

  1. endif

Je ne sais pas si tu comprend " inclusions circulaires", mais utilise cette méthode...

lag-it
lag-it
Niveau 10
23 avril 2004 à 18:13:52

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...

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:15:58

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

Mathrim
Mathrim
Niveau 8
23 avril 2004 à 18:20:05

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:

  1. ifdef FULLSCREEN

-- suite de commande en C spécifique au fullscreen.

  1. endif

Au début de ton code, si tu mets:

  1. define FULLSCREEN

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 ? ) .

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:22:34

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

Mathrim
Mathrim
Niveau 8
23 avril 2004 à 18:35:12

Si tu as un fichier MyFile.h, tu dois écrire:

  1. ifndef _MyFile_
  2. define _MyFile_
  1. include . ..

code

  1. endif

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.

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:37:03

ah ok, c´était tip top ce qu´il me fallait, merci beaucoup ! :)

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:49:36

ah, une dernière question..
pourquoi doit-on faire un #define _fichier_H ?

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:53:33

lol, j´ai mis ça dans un header:

  1. ifndef _SDL/SDL_H
  2. define _SDL/SDL_H
  3. include < SDL/SDL.h>
  4. endif

mais euh, ça marche pas ^^

Mathrim
Mathrim
Niveau 8
23 avril 2004 à 18:56:29

Je crois que tu n´as pas vraiment compris.

  1. ifdef est suivi d´un nom proche du fichier que tu es en train d´écrire ( et n´a rien à voir avec les fichiers que tu inclus).

Là, tu devrais faire, si ton fichier s´appelle sprite.h ( par exemple):

  1. ifndef _SPRITE_
  2. define _SPRITE_
  1. include < SDL/SDL.h>

tout le code

  1. endif
_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 18:58:29

ah ok lol thx
mais ca veut dire alors que je dois faire dans tous les fichiers #define _SPRITE_ ?

Mathrim
Mathrim
Niveau 8
23 avril 2004 à 19:00:07

Non, seulement dans le fichier sprite.h
Tu ne fais un #ifndef / #define qu´une seule fois par fichier.

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 19:02:43

ok thx :) .

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 19:10:20

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 ?

Altonfrere
Altonfrere
Niveau 10
23 avril 2004 à 19:10:34

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 :

  1. ifndef _SPRITE_H
  2. define _SPRITE_H

/ / et là tu mets le reste de ton . h

  1. endif

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)

  1. ifdef _DEBUG

/ / afficher des infos pour débugger ton code
/ / le contenu d´une variable
/ / etc...

  1. endif

- idem pour une version démo

  1. ifndef DEMO_VERSION

. ..
/ / code pour la sauvegarde par exemple
/ / donc en version démo cette partie du code
/ / ne sera pas compilée

  1. else

/ / afficher " Sauvegarde impossible en version démo"

  1. endif

- définir des constantes si elles n´existent pas déjà :

  1. ifndef PI
  2. define PI 3.141592
  3. endif

- etc...

Altonfrere
Altonfrere
Niveau 10
23 avril 2004 à 19:12:50

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"

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 19:25:28

ah ok merci beaucoup ! !
donc je dois rajouter partout extern devant mes variables dans le functions.cpp à linker ?
je vais essayer, encore merci

_[CONKER]_
_[CONKER]_
Niveau 10
23 avril 2004 à 19:27:17

ouaaah super ca s´est compilé :D
mais bon j´ai quand même un seg fault donc je vais vérifier mes fonctions ^^

Altonfrere
Altonfrere
Niveau 10
23 avril 2004 à 21:31:20

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)

Sous forums
  • Aide à l'achat Mac
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Internet
  • Steam Deck
  • Hardware
La vidéo du moment