 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Pascal Guest
|
Posted: Tue Feb 22, 2005 5:09 pm Post subject: variable globale |
|
|
Bonjour,
J'ai besoin d'une variable globale, et je ne sais pas la déclaré.
Dans mon fichier Interface.h, qui contient la classe Interface, j'ai
déclaré une variable globale comme suit:
int varglobale;
#ifndef INTERFACE
#define INTERFACE
class Interface { ... };
#endif
Le problème, c'est qu'à la compilation je me retrouve avec cette erreur:
Interface.o(.bss+0x4):/usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_tree.h:194: multiple definition of `g_TAILLEPAGE'
GestionnaireMV.o(.bss+0x0):/export/home/05gmi3/teapa5/projet/SGBD/GestionnaireMV.cpp:8: first defined here
Et dans mon fichier GestionnaireMV.cpp, j'ai fait un #include
"Interface.h"
D'où vient le pb? ça fait un moment que je cherche en vain.
|
|
| Back to top |
|
 |
Jean-Fabrice RABAUTE Guest
|
Posted: Tue Feb 22, 2005 5:20 pm Post subject: Re: variable globale |
|
|
Pascal wrote:
| Quote: | Bonjour,
J'ai besoin d'une variable globale, et je ne sais pas la déclaré.
Dans mon fichier Interface.h, qui contient la classe Interface, j'ai
déclaré une variable globale comme suit:
int varglobale;
#ifndef INTERFACE
#define INTERFACE
class Interface { ... };
#endif
Le problème, c'est qu'à la compilation je me retrouve avec cette erreur:
Interface.o(.bss+0x4):/usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_tree.h:194: multiple definition of `g_TAILLEPAGE'
GestionnaireMV.o(.bss+0x0):/export/home/05gmi3/teapa5/projet/SGBD/GestionnaireMV.cpp:8: first defined here
Et dans mon fichier GestionnaireMV.cpp, j'ai fait un #include
"Interface.h"
D'où vient le pb? ça fait un moment que je cherche en vain.
|
En declarant ta variable dans le .h elle sera définie dans chaque
fichier .cpp compilé en .o
Il faut définir ta var globale en "extern" dans ton fichier .h et la
definir normalement dans 1 SEUL FICHIER .cpp !
Donc dans ton .h :
extern int varglobale;
Dans 1 SEUL DE TES .CPP :
int varglobale;
Voila. Ca devrait le faire.
A+
--
Regards / Cordialement
====================
Jean-Fabrice Rabaute
CORE SERVICES :: Software/Web development & Consulting services
http://www.debugbar.com : The most advanced WEB development tool for
Internet Explorer
http://www.core-services.fr - {Enjoy the future today}
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Tue Feb 22, 2005 5:25 pm Post subject: Re: variable globale |
|
|
Pascal wrote:
| Quote: | Bonjour,
J'ai besoin d'une variable globale, et je ne sais pas la déclaré.
Dans mon fichier Interface.h, qui contient la classe Interface, j'ai
déclaré une variable globale comme suit:
int varglobale;
#ifndef INTERFACE
#define INTERFACE
class Interface { ... };
#endif
Le problème, c'est qu'à la compilation je me retrouve avec cette erreur:
Interface.o(.bss+0x4):/usr/lib/gcc-lib/i586-pc-linux-gnu/3.2.2/include/g++-v3/bits/stl_tree.h:194: multiple definition of `g_TAILLEPAGE'
GestionnaireMV.o(.bss+0x0):/export/home/05gmi3/teapa5/projet/SGBD/GestionnaireMV.cpp:8: first defined here
Et dans mon fichier GestionnaireMV.cpp, j'ai fait un #include
"Interface.h"
D'où vient le pb? ça fait un moment que je cherche en vain.
Sauf erreur, si tu inclues plusieurs fois ton fichier, tu auras |
plusieurs fois la variable varglobale de declaree. En plus, les
variables globales c'est mal, c'est le diable. Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas... ). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale. Ca a le merite de m'eviter de faire des
aneries...enfin en tout cas, pour ca... )
K.
|
|
| Back to top |
|
 |
Pascal Guest
|
Posted: Tue Feb 22, 2005 6:07 pm Post subject: Re: variable globale |
|
|
On Tue, 22 Feb 2005 18:20:21 +0100, Jean-Fabrice RABAUTE wrote:
| Quote: | En declarant ta variable dans le .h elle sera définie dans chaque
fichier .cpp compilé en .o
Il faut définir ta var globale en "extern" dans ton fichier .h et la
definir normalement dans 1 SEUL FICHIER .cpp !
Donc dans ton .h :
extern int varglobale;
Dans 1 SEUL DE TES .CPP :
int varglobale;
Voila. Ca devrait le faire.
A+
|
Salut,
Merci beaucoup, ça marche impeccable.
|
|
| Back to top |
|
 |
Pascal Guest
|
Posted: Tue Feb 22, 2005 6:09 pm Post subject: Re: variable globale |
|
|
On Tue, 22 Feb 2005 18:25:55 +0100, korchkidu wrote:
| Quote: | Sauf erreur, si tu inclues plusieurs fois ton fichier, tu auras
plusieurs fois la variable varglobale de declaree. En plus, les
variables globales c'est mal, c'est le diable. Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas... ). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale. Ca a le merite de m'eviter de faire des
aneries...enfin en tout cas, pour ca... )
K.
|
J'ai voulu le mettre en static, mais il me mettait variable undefined ...
Dans ma classe Truc, j'ai défini :
class Truc {
public:
static int machin;
....
}
Puis dans le .cpp d'une autre classe, j'avais fait un include de Truc.h,
et lorsque j'appelais Truc::machin, il me mettait variable undefined.
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Tue Feb 22, 2005 6:21 pm Post subject: Re: variable globale |
|
|
Pascal wrote:
| Quote: | On Tue, 22 Feb 2005 18:25:55 +0100, korchkidu wrote:
Sauf erreur, si tu inclues plusieurs fois ton fichier, tu auras
plusieurs fois la variable varglobale de declaree. En plus, les
variables globales c'est mal, c'est le diable. Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas... ). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale. Ca a le merite de m'eviter de faire des
aneries...enfin en tout cas, pour ca... )
K.
J'ai voulu le mettre en static, mais il me mettait variable undefined ...
Dans ma classe Truc, j'ai défini :
class Truc {
public:
static int machin;
...
}
Puis dans le .cpp d'une autre classe, j'avais fait un include de Truc.h,
et lorsque j'appelais Truc::machin, il me mettait variable undefined.
Dans le cpp il faut que tu la definisses. Tu l'initialises a une valeur |
qui va bien:
Truc::mavarglobale = 0.;
par exemple.
K.
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Tue Feb 22, 2005 7:25 pm Post subject: Re: variable globale |
|
|
korchkidu wrote:
| Quote: | En plus, les
variables globales c'est mal, c'est le diable.
|
Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle compromise si
j'utilise cin et cout ?
| Quote: | Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas... ).
|
Et quelle est la différence avec une variable globale ?
Pour moi, le principal inconvénient (hors raisons métaphysiques) des
variables globales, c'est que potentiellement n'importe quelle fonction
peut la modifier n'importe quand, ce qui brise toute encapsulation et si
rend l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.
Un autre inconvénient, moindre, et que l'ordre de création de variables
globales définies dans des unités de compilation différentes est non
spécifié.
Dans les deux cas, ta solution n'apporte pas vraiment de solution, et je
ne vois pas en quoi c'est préférable(*) par rapport à de simples
variables globales.
(*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie, mais
qui à part James ici a connu ce genre de compilateur... ;)
--
Loïc
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Wed Feb 23, 2005 7:41 am Post subject: Re: variable globale |
|
|
Loïc Joly wrote:
| Quote: | Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle compromise si
j'utilise cin et cout ?
Si tu te confesses avant, on pourra toujours negocier... |
| Quote: | Et quelle est la différence avec une variable globale ?
Pour moi, le principal inconvénient (hors raisons métaphysiques) des
variables globales, c'est que potentiellement n'importe quelle fonction
peut la modifier n'importe quand, ce qui brise toute encapsulation et si
rend l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.
Ben pour moi, le principal inconvenient des variables globales, c'est |
que l'on peut facilement s'emmeler les pinceaux en la modifiant sans le
vouloir...(ce qui revient a peu pres a ton premier point). Par contre,
si tu ecris Common::mavariable, ca diminue les risques qd meme (hors
raisons metaphysiques bien evidemment...).
| Quote: | Un autre inconvénient, moindre, et que l'ordre de création de variables
globales définies dans des unités de compilation différentes est non
spécifié.
Par contre la serieusement, je ne te suis plus. Qu'est ce que ca peut |
poser comme probleme ce genre de....problemes? (je precise que c'est une
vraie question..)
| Quote: | Dans les deux cas, ta solution n'apporte pas vraiment de solution, et je
ne vois pas en quoi c'est préférable(*) par rapport à de simples
variables globales.
La lisibilite? |
| Quote: | (*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie, mais
qui à part James ici a connu ce genre de compilateur...
Desole, je suis trop jeune, je n'ai jamais programme sur des cartes a |
trous...:D
K.
|
|
| Back to top |
|
 |
Pascal Guest
|
Posted: Wed Feb 23, 2005 7:47 am Post subject: Re: variable globale |
|
|
korchkidu wrote:
| Quote: | Ben pour moi, le principal inconvenient des variables globales, c'est
que l'on peut facilement s'emmeler les pinceaux en la modifiant sans le
vouloir...(ce qui revient a peu pres a ton premier point). Par contre,
si tu ecris Common::mavariable, ca diminue les risques qd meme (hors
raisons metaphysiques bien evidemment...).
|
Je suis pas du tout d'accord. Mettre une variable static n'a de sens que
si la variable est bien un membre de la classe. Or certaine variable ne
font partie d'aucune classe. Moi je ne trouve pas ça correct de le
mettre dans une classe, et le mettre en static, juste pour ne pas avoir
une variable globale. Ensuite je ne comprends pas ton argumentation.
Comment tu fais pour modif une variable globale sans t'en rendre compte?
Un exemple pour illustrer ton propos serait le bienvenu.
Au détriment de la cohérence?
--
Pascal
|
|
| Back to top |
|
 |
Pascal Guest
|
Posted: Wed Feb 23, 2005 7:55 am Post subject: Re: variable globale |
|
|
Loïc Joly wrote:
| Quote: | Pour moi, le principal inconvénient (hors raisons métaphysiques) des
variables globales, c'est que potentiellement n'importe quelle fonction
peut la modifier n'importe quand, ce qui brise toute encapsulation et si
rend l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.
|
Une variable static aussi. Et pour moi ce que tu cites n'est pas un
inconvénient, mais son principal avantage. C'est là toute l'intérêt de
ce genre de variable.
| Quote: | (*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie, mais
qui à part James ici a connu ce genre de compilateur...
|
Effectivment.
--
Pascal
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Wed Feb 23, 2005 8:51 am Post subject: Re: variable globale |
|
|
korchkidu wrote:
| Quote: | Loïc Joly wrote:
Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle compromise si
j'utilise cin et cout ?
Si tu te confesses avant, on pourra toujours negocier...
|
Ah, c'est dans ce sens que ça marche ? Mon père, je vais pêcher,
torture, violer,... pendant les deux prochaines décénies, pourriez vous
me confesser par avance ?
| Quote: | Un autre inconvénient, moindre, et que l'ordre de création de
variables globales définies dans des unités de compilation différentes
est non spécifié.
Par contre la serieusement, je ne te suis plus. Qu'est ce que ca peut
poser comme probleme ce genre de....problemes? (je precise que c'est une
vraie question..)
|
Deux variables globales a et b de type A et B définies dans deux unités
de compilation différentes. Dans le constructeur de A, on fait appel à
l'objet b. Pourtant on n'est pas sur qu'au moment où on crée a, b soit
déjà crée.
Ca arrive en fait relativement souvent.
| Quote: | Dans les deux cas, ta solution n'apporte pas vraiment de solution, et
je ne vois pas en quoi c'est préférable(*) par rapport à de simples
variables globales.
La lisibilite?
|
Mouaip, le fait de pouvoir faire une recherche textuelle facilement sur
toutes les utilisations des variables globales est un plus, mais je
pense qu'on fait tout aussi bien en mettant ces variables dans un
namespace (qui a aussi l'avantage de pouvoir être extensible...) qu'en
en faisant des variables statiques de classe.
| Quote: | (*) Sur un compilateur ne supportant pas les namespaces, je pourrais
encore admettre un avantage que ça permet de les simuler en partie,
mais qui à part James ici a connu ce genre de compilateur... ;)
Desole, je suis trop jeune, je n'ai jamais programme sur des cartes a
trous...
|
Pourtant, ton argument ne s'appliquerait pleinement que si c'était le cas.
--
Loïc
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Wed Feb 23, 2005 9:16 am Post subject: Re: variable globale |
|
|
Loïc Joly wrote:
| Quote: | korchkidu wrote:
En plus, les variables globales c'est mal, c'est le diable.
Ah bon ? Et ma place au Walhalla/Champs Elysées est-elle
compromise si j'utilise cin et cout ?
|
Certainement. Quant à cerr, en revanche... :-)
| Quote: | Perso, moi je prefere faire une classe ou je mets mes
variables globales comme membres statiques (je sais pas si
c'est une bonne idee mais c'est pratique en tout cas... ).
Et quelle est la différence avec une variable globale ?
|
La risque que quelqu'un d'autre en modifie la valeur de façon
inopinément. La risque de conflit de nom est moindre avec la
classe, aussi ; aujourd'hui, il y a des espaces référentiels, ce
n'est que très récemment qu'on pourrait s'en servir dans du code
portable. (J'ai eu des problèmes avec une utilisation dans VC++
6.0. Je ne sais pas d'où venait le problème, mais j'ai ôté les
namespaces du projet, et ça a marché. Or, VC++ 6.0 sert encore
dans beaucoup d'endroits.)
| Quote: | Pour moi, le principal inconvénient (hors raisons
métaphysiques) des variables globales, c'est que
potentiellement n'importe quelle fonction peut la modifier
n'importe quand, ce qui brise toute encapsulation et si rend
l'écriture de tout test unitaire un peu sérieux pratiquement
impossible.
Un autre inconvénient, moindre, et que l'ordre de création de
variables globales définies dans des unités de compilation
différentes est non spécifié.
Dans les deux cas, ta solution n'apporte pas vraiment de
solution, et je ne vois pas en quoi c'est préférable(*) par
rapport à de simples variables globales.
|
Pour le premier inconvénient, rendre la variable membre privée
d'une classe apporte beaucoup.
La vrai question, c'est qui doit se servir de la variable.
--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Wed Feb 23, 2005 9:18 am Post subject: Re: variable globale |
|
|
Pascal wrote:
| Quote: | korchkidu wrote:
Je suis pas du tout d'accord. Mettre une variable static n'a de sens que
si la variable est bien un membre de la classe.
Bah si ma classe est justement faite pour "recevoir" les variables |
globales...
| Quote: | Or certaine variable ne
font partie d'aucune classe.
Si elles sont globales, alors elles font parties de ma classe faite |
specialement pour...
| Quote: | Moi je ne trouve pas ça correct de le
mettre dans une classe, et le mettre en static, juste pour ne pas avoir
une variable globale.
Mais ce n'est pas UNE classe, mais LA classe... ) Pas taper... |
| Quote: | Ensuite je ne comprends pas ton argumentation.
Comment tu fais pour modif une variable globale sans t'en rendre compte?
Un exemple pour illustrer ton propos serait le bienvenu.
#include |
int i = 4;
int plus1(int i);
int main(void)
{
int i = 20;
i = plus1(i);
std::cout<<"Le resultat du programme est: "<
return 0;
}
int plus1(int j)
{
return ++i;
}
Quand tu sais deja quel est le probleme ca aide, qd tu relis ca, c'est
plus difficile.
(Ce code est tire d'une histoire vraie...)
| Quote: | La lisibilite?
Au détriment de la cohérence?
Quelle est l'incoherence la dedans? |
De plus, si un jour tu as besoin de beaucoup de variables globales, tu
verras assez vite que la possibilite de les voir du premier coup d'oeil
fait gagner un temps non-negligeable.
K.
|
|
| Back to top |
|
 |
korchkidu Guest
|
Posted: Wed Feb 23, 2005 9:21 am Post subject: Re: variable globale |
|
|
Loïc Joly wrote:
| Quote: | korchkidu wrote:
Ah, c'est dans ce sens que ça marche ? Mon père, je vais pêcher,
torture, violer,... pendant les deux prochaines décénies, pourriez vous
me confesser par avance ?
On m'aurait menti??... |
Ca expliquerait bien des choses....
| Quote: | Deux variables globales a et b de type A et B définies dans deux unités
de compilation différentes. Dans le constructeur de A, on fait appel à
l'objet b. Pourtant on n'est pas sur qu'au moment où on crée a, b soit
déjà crée.
Ca arrive en fait relativement souvent.
Oui, oui. C'est tout de suite plus clair avec un exemple. |
| Quote: | Mouaip, le fait de pouvoir faire une recherche textuelle facilement sur
toutes les utilisations des variables globales est un plus, mais je
pense qu'on fait tout aussi bien en mettant ces variables dans un
namespace (qui a aussi l'avantage de pouvoir être extensible...) qu'en
en faisant des variables statiques de classe.
C'est ce que j'avais fait au debut effectivement. Je devais en plus |
rajouter un traitement sur mes variables globales dans certaines
condition alors j'ai mis ca dans une classe finalement. Je suis sur
qu'en fouillant la conception, ya moyen de faire plus propre mais je
n'avais franchement pas le courage de tout casser...
K.
|
|
| Back to top |
|
 |
Arnaud Guest
|
Posted: Wed Feb 23, 2005 9:33 am Post subject: Re: variable globale |
|
|
korchkidu <korch_ki_du (AT) yahoo (DOT) fr> wrote in message
| Quote: | Perso, moi je prefere
faire une classe ou je mets mes variables globales comme membres
statiques (je sais pas si c'est une bonne idee mais c'est pratique en
tout cas... ). Comme ca, dans mon code j'ai des trucs du genre
Common::mavarglobale.
|
Je ne sais pas du tout si c'est une solution courante, mais j'utilise
une variante de la "classe à variables globales". Souvent, ces
variables globales ne sont pas utilisées par toutes les classes, mais
plutôt par des classes qui n'ont rien à voir les unes avec les autres.
Dans ce cas, je fais quelque chose comme :
class Variables
{ protected : static int var1; };
class BesoinDeVar1 : public Variables
{
// ... ici, on peut utiliser var1 comme une variable membre
};
class PasBesoinDeVar1
{
// ici, rien à faire, var1 est inconnue au bataillon
};
Ca me semble préserver l'encapsulation, il n'y a plus vraiment de
variables globale, mais var1 peut être utilisée à peu près n'importe
où, dans les classes qui doivent y avoir accès.
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|