[library] OpenGL pour Borland C++ Builder
Résolu/Fermé
Wanou
Messages postés
3
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
3 août 2006
-
1 août 2006 à 21:26
Wanou Messages postés 3 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 3 août 2006 - 3 août 2006 à 05:05
Wanou Messages postés 3 Date d'inscription mardi 1 août 2006 Statut Membre Dernière intervention 3 août 2006 - 3 août 2006 à 05:05
A voir également:
- [library] OpenGL pour Borland C++ Builder
- Pdftk builder - Télécharger - PDF
- Tiny11 builder - Accueil - Windows
- Family tree builder - Télécharger - Généalogie
- Borland database engine - Télécharger - Édition & Programmation
- Z-library - Accueil - Services en ligne
2 réponses
Wanou
Messages postés
3
Date d'inscription
mardi 1 août 2006
Statut
Membre
Dernière intervention
3 août 2006
1
3 août 2006 à 05:05
3 août 2006 à 05:05
Merci Beaucoup ! ! ! j'es enfin réusi a compiler mon code sans probleme
mamiemando
Messages postés
33654
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
4 mai 2025
7 847
3 août 2006 à 04:24
3 août 2006 à 04:24
Une déclaration multiple survient au moment du linkage, c'est à dire au moment ou les modules compilés sont recollés de sorte à former un exécutable. Le problème c'est que par le biais des #include, tu peux avoir compiler une même section de code dans deux modules différents. Du coup, à la fin, tu obtiens une déclaration multiple.
Exemple
a.hpp
b.hpp
main.hpp
Quand on compile voici ce qu'il se passe :
* a ne dépend de personne et a.o (le module a compilé) contient le code de f. Jusque là tout va bien.
* b inclue a.hpp donc recopie le code concerné, celui de f(). b.o contient donc les fonctions f et g
* enfin on compile main.hpp, et là blam, on a deux fois f de définie, une fois dans a.hpp et une fois dans b.hpp, d'où multidéfinition...
Comment éviter le problème ?
=> Protéger le module pour que le hpp ne soit inclu qu'une fois :
plop.hpp
Autre point important faire attention (en particulier si des fonctions sont implémentées dans le .hpp) aux multidéfinitions de fonction, ie les fonctions dont le code à été copilé pour plusieurs .o. Supposons que a.hpp et b.hpp soient désormais protégés.
* a.o contiendra le code de f
* b.o contiendra le code de f et de g
* au cours des include du main le protype de f et g ne seront inclus qu'une fois, donc là tout va bien, opn n'a pas de multidéfinition. Par contre à la phase de linkage, f sera définie dans a.o et b.o d'ou une multi définition (!= déclaration multiple).
Pour régler le problème, soit on implémente f et g respectivement dans a.cpp et b.cpp, soit on les laisse dans les .hpp en les précédant du mot clé inline. Attention comme son nom l'indique ce mot clé est plutôt reservé au fonctions courtes car concrètement le compilateur remplace toutes les occurences de f() et de g() directement par leur code source.
Maintenant tu sais tout sur les déclarations (portotype) et définitions (code source) multiples ^^
Bonne chance
Exemple
a.hpp
void f(){ std::cout << "Je suis f :-)" << std::endl; }
b.hpp
#include "a.hpp" void g(){ f(); }
main.hpp
#include "a.hpp" #include "b.hpp" int main(){ f(); g(); }
Quand on compile voici ce qu'il se passe :
* a ne dépend de personne et a.o (le module a compilé) contient le code de f. Jusque là tout va bien.
* b inclue a.hpp donc recopie le code concerné, celui de f(). b.o contient donc les fonctions f et g
* enfin on compile main.hpp, et là blam, on a deux fois f de définie, une fois dans a.hpp et une fois dans b.hpp, d'où multidéfinition...
Comment éviter le problème ?
=> Protéger le module pour que le hpp ne soit inclu qu'une fois :
plop.hpp
#ifndef PLOP #define PLOP //... code de plop.hpp ... #endif
Autre point important faire attention (en particulier si des fonctions sont implémentées dans le .hpp) aux multidéfinitions de fonction, ie les fonctions dont le code à été copilé pour plusieurs .o. Supposons que a.hpp et b.hpp soient désormais protégés.
* a.o contiendra le code de f
* b.o contiendra le code de f et de g
* au cours des include du main le protype de f et g ne seront inclus qu'une fois, donc là tout va bien, opn n'a pas de multidéfinition. Par contre à la phase de linkage, f sera définie dans a.o et b.o d'ou une multi définition (!= déclaration multiple).
Pour régler le problème, soit on implémente f et g respectivement dans a.cpp et b.cpp, soit on les laisse dans les .hpp en les précédant du mot clé inline. Attention comme son nom l'indique ce mot clé est plutôt reservé au fonctions courtes car concrètement le compilateur remplace toutes les occurences de f() et de g() directement par leur code source.
#ifndef A_HPP #define A_HPP inline void f(){ std::cout << "je suis une fonction inline" << std::endl; } #endif
Maintenant tu sais tout sur les déclarations (portotype) et définitions (code source) multiples ^^
Bonne chance