IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Redéfinition à l'inclusion malgré des gardes


Sujet :

C++

  1. #1
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    juin 2007
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : juin 2007
    Messages : 856
    Points : 1 828
    Points
    1 828
    Par défaut Redéfinition à l'inclusion malgré des gardes
    Bonjour, la situation me laisse assez pantois, peut-être que quelqu'un pourra m'aider. Je vais tâcher d'expliquer la situation.

    J'essaie de faire un petit jeu de labyrinthe avec opengl, en partant d'un programme proposé dans un bouquin et en le modifiant. J'ai plusieurs classes pour le labyrinthe, les cellules, les objets du jeu. J'ai des relations croisées, dans le sens par exemple où un labyrinthe a des vecteurs de cellules, et une cellule possède une référence au labyrinthe qui le contient, une cellule contient un objet du jeu et un objet du jeu a une référence envers son emplacement. J'ai été obligé de passer par des déclarations de prototype.

    Une interface inclue les fichiers de glut, avant d'être incluse dans les classe l'implémentant. Mon souci apparait quand je veux faire des inclusions pour les références croisées. A ce moment-là, le compilateur affirme qu'il y a redéfinition ( "exit", "__declspec(noreturn)" ?????) dans le fichier "stdlib.h". Je suppose que c'est lié à opengl, puisque je ne fais aucune inclusion C explicite.

    Le message d'erreur :
    error C2381: 'exit'*: redéfinition*; __declspec(noreturn) est différent

    Le conflit semble se poser entre "stdlib.h" et "glut.h".

    Je pose ici un récapitulatif de certains classes, qui suffisent à générer le problème:

    Drawable : interface d'un objet dessinable, inclu glut.
    BaseGameObject : classe abstraite pour les objets du jeu, contient un pointeur vers un objet Cell conteneur, hérite de Drawable.
    Cell : classe abstraite, objet représentant une "case" du labyrinthe, hérite de Drawable, contient un pointeur vers un objet BaseGameObjet contenu dans la case, et un pointeur vers un objet Labyrinth, conteneur de la cellule.
    Labyrinth : objet représentant le plateau de jeu, hérite de Drawable, contient une matrice de pointeurs de Cell (vector<vector<Cell*> >).

    Je travaille avec Visual C++ 2008 Express Edition. Une fois n'est pas coutume j'ai utilisé le pragma once de Visual au lieu des #ifndef classique, mais j'ai du mal à croire que ça puisse être la cause de mon problème.

    J'hésite à mettre ici le code source, il y a plusieurs fichiers concernés, je le ferai s'il le faut mais peut-être que ces premiers indices vont éveiller quelque chose dans la mémoire de programmeurs qui ont plus d'expérience que moi.

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 008
    Points
    13 008
    Par défaut
    Citation Envoyé par Noxen Voir le message
    Le message d'erreur :
    error C2381: 'exit'*: redéfinition*; __declspec(noreturn) est différent

    Le conflit semble se poser entre "stdlib.h" et "glut.h".
    Peux-tu poster ces deux fichiers? Je ne vois pas pourquoi l'erreur serait dans l'inclusion croisée, mais plutôt dans une directive de compilation manquante ou en trop...

  3. #3
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    juin 2007
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : juin 2007
    Messages : 856
    Points : 1 828
    Points
    1 828
    Par défaut
    Bon, ça ne va pas être possible de poster les fichiers direct, stdlib.h est trop long. Y-a-t'il un moyen de mettre en ligne des fichiers si vous voulez les télécharger ?

    Pour précision :

    La ligne de stdlib.h qui est soulignée pour l'erreur est la 371 :
    _CRTIMP __declspec(noreturn) void __cdecl exit(_In_ int _Code);

    Il y a effectivement une fonction exit définie dans glut.h, mais ce qui est bizarre c'est que le problème ne se pose pas tout le temps. Le compilateur ne semble pas tolérer que j'inclue Cell.h dans Labyrinth.h et dans BaseGameObject.h, si j'efface l'inclusion dans BaseGameObject.h le code compile.

    Peut-être faut-il que je poste une archive du projet si quelqu'un veut tester ?

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : juin 2008
    Messages : 7 634
    Points : 13 008
    Points
    13 008
    Par défaut
    [EDIT] Après une petite recherche sur , il s'avère qu'il s'agit d'un problème connu : ici et ici.
    Solution : inclusions dans ce sens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include <stdlib.h>
    #include <GL/glut.h>
    [EDIT 2]: En fait, sur le forum, le problème s'était déjà posé.

  5. #5
    Membre chevronné
    Homme Profil pro
    edi
    Inscrit en
    juin 2007
    Messages
    856
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : edi

    Informations forums :
    Inscription : juin 2007
    Messages : 856
    Points : 1 828
    Points
    1 828
    Par défaut
    Effectivement. Je ne pensais pas que le problème s'était déjà posé exactement dans les même termes, je pensais que ça pouvait venir d'un option sur le compilateur ou quelque chose comme ça que je ne connaissais pas (les __declspec et companie c'est un truc que je n'ai encore jamais étudié).

    Donc en fait on a simplement encore affaire avec la notion de standard si particulière à M$ (va vraiment faloir que je me repenche sur l'installation de code::blocks...).

    Merci en tout cas de ton aide et désolé de t'avoir fait perdre du temps.

    Joyeux Noël et bonnes fêtes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Inclusion automatique des icones
    Par Kerod dans le forum Dreamshield
    Réponses: 5
    Dernier message: 13/02/2008, 03h21
  2. [HTML] visualiser les pages html incluses dans des frames
    Par missgeek dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 04/07/2007, 23h10
  3. Débutant : Passage en domaine malgré des contraintes ?
    Par Allen dans le forum Windows Serveur
    Réponses: 2
    Dernier message: 25/04/2007, 17h44
  4. [SQL] Forcer l'affichage d'une table SQL malgrès des collones (jointure) vide
    Par arnaudperfect dans le forum PHP & Base de données
    Réponses: 18
    Dernier message: 19/04/2007, 10h18
  5. Appel à des fonctions incluses dans des DLL
    Par Greybird dans le forum Langage
    Réponses: 3
    Dernier message: 26/05/2003, 13h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo