OVH Cloud OVH Cloud

Variable Globale

14 réponses
Avatar
Michael Moreno
Bonjour,

Quelle est la maniere la plus simple pour avoir des variables globales
en C++ svp ?

Certains preconisent de les mettre dans des cpp, d'autres dans des .h

Du genre

1. init.h
2. .../...
3. #ifdef ALLOC_GLOBAL
4. int toto;
5. int tata = 93893; //Avec une valeur de départ
6. MaStruct titi;
7. #else
8. extern int toto;
9. extern int tata; //!!! Ne pas redonner de valeur avec
"extern"
10. extern MaStruct titi;
11. #endif



1. init.cpp
2. #define ALLOC_GLOBAL
3. #include "init.h"
4. .../...



1. <autres modules cpp>
2. //pas de #define ALLOC_GLOBAL avant #include "init.h"
3. #include "init.h"
4. .../...


Vous en pensez quoi svp ?

Merci,

Michael

--
----
http://michael.moreno.free.fr/

10 réponses

1 2
Avatar
Marc Boyer
In article , Michael Moreno wrote:
Bonjour,

Quelle est la maniere la plus simple pour avoir des variables globales
en C++ svp ?

Certains preconisent de les mettre dans des cpp, d'autres dans des .h

Du genre

1. init.h
2. .../...
3. #ifdef ALLOC_GLOBAL
4. int toto;
5. int tata = 93893; //Avec une valeur de départ
6. MaStruct titi;
7. #else
8. extern int toto;
9. extern int tata; //!!! Ne pas redonner de valeur avec
"extern"
10. extern MaStruct titi;
11. #endif


Globalement, cette méthode consiste à se donner beaucoup de mal
pour mettre dans le même fichier ce qui devrait être dans deux
fichiers distincts.

Dans le .hpp: la déclaration (extern)
Dans le .cpp: la définition (avec initialisation)

Ceci dit, pourquoi faire une variable globale surtout ?

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.

Avatar
Michael Moreno
Merci

Ceci dit, pourquoi faire une variable globale surtout ?


Dans une appli Multi-thread c++ qui recoit des appel callback en C, a
part avoir des variables globales por gerer certains cas, je ne vois
pas comment faire. Sans les appels callback d'une appli exterieure,
c'est facile de s'en passer.

--
----
http://michael.moreno.free.fr/

Avatar
Marc Boyer
Michael Moreno wrote:
Merci

Ceci dit, pourquoi faire une variable globale surtout ?


Dans une appli Multi-thread c++ qui recoit des appel callback en C, a
part avoir des variables globales por gerer certains cas, je ne vois
pas comment faire.


Ben, même en C, il y avait le célèbre couple get/set qui manipule
une variable locale au module (et qui dans un contexte multi-thread
permet de mettre un lock/unlock autour si besoin).
En C++, on préfère souvent une classe singleton.

Après, peut-être qu'il y a des contraintes dans ton appli qui
font qu'aucune de ces deux approches n'est la bonne.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Michael Moreno
Ben, même en C, il y avait le célèbre couple get/set qui manipule
une variable locale au module (et qui dans un contexte multi-thread
permet de mettre un lock/unlock autour si besoin).
En C++, on préfère souvent une classe singleton.


Il y aussi la possibilite qu'une autre personne a ecrit le code... et
que tu doives le debugge sans tout casser et en un temps record... Tu
vois ce que je veux dire ?

--
----
http://michael.moreno.free.fr/

Avatar
Marc Boyer
In article , Michael Moreno wrote:
Ben, même en C, il y avait le célèbre couple get/set qui manipule
une variable locale au module (et qui dans un contexte multi-thread
permet de mettre un lock/unlock autour si besoin).
En C++, on préfère souvent une classe singleton.


Il y aussi la possibilite qu'une autre personne a ecrit le code... et
que tu doives le debugge sans tout casser et en un temps record... Tu
vois ce que je veux dire ?


C'est un problème différent, que tu n'avais pas mentionné. C'est
une raison valable.
Donc, tu *dois* offrir une variable partagée par compatibilité,
et tu te demandes comment la déclarer.
Car sinon, le couple set/get permet justement de mettre des
controles utile au debug (et c'est franchement pas plus long
que la variable globale, et plus evolutif).

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Michael Moreno
Car sinon, le couple set/get permet justement de mettre des
controles utile au debug (et c'est franchement pas plus long
que la variable globale, et plus evolutif).


Oui, en effet, je viens juste de me creer une classe Boolean qui me
permet d'afficher son nom et sa valeur a chaque fois qu'elle est
modifiee a l'aide de OutputDebugString. C'est tres pratique pour le
debug. Mais on ne peut malheureusement pas toujours le faire.

Merci beaucoup.

--
----
http://michael.moreno.free.fr/

Avatar
Marc Boyer
In article , Michael Moreno wrote:
Car sinon, le couple set/get permet justement de mettre des
controles utile au debug (et c'est franchement pas plus long
que la variable globale, et plus evolutif).


Oui, en effet, je viens juste de me creer une classe Boolean qui me
permet d'afficher son nom et sa valeur a chaque fois qu'elle est
modifiee a l'aide de OutputDebugString. C'est tres pratique pour le
debug. Mais on ne peut malheureusement pas toujours le faire.


Nous ne parlons pas de la même chose.

Ce que je te dis, c'est que plutôt qu'avoir une variable globale
int Truc;
tu offres dans le .hpp
int getTruc(); // ou int getTruc(void); en C
void setTruc(
et tu mets dans le .cpp
static int Truc;

Je ne vois pas trop dans quel cas c'est infaisable (à moins
de ne pas avoir la main sur le code qui fait l'appel à la var
globale, mais dans ce cas là, tu ne peux pas non plus définir
son type à ta convenance).

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Michael Moreno
Je ne vois pas trop dans quel cas c'est infaisable (à moins
de ne pas avoir la main sur le code qui fait l'appel à la var
globale, mais dans ce cas là, tu ne peux pas non plus définir
son type à ta convenance).


C'est exactement le cas.

--
----
http://michael.moreno.free.fr/

Avatar
Marc Boyer
In article , Michael Moreno wrote:
Je ne vois pas trop dans quel cas c'est infaisable (à moins
de ne pas avoir la main sur le code qui fait l'appel à la var
globale, mais dans ce cas là, tu ne peux pas non plus définir
son type à ta convenance).


C'est exactement le cas.


Ben, tu me dis que tu as définit un type Boolean, c'est donc
que tu as quand même accès aux sources, non ?

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Michael Moreno
Ben, tu me dis que tu as définit un type Boolean, c'est donc
que tu as quand même accès aux sources, non ?


Non, c'est pour une autre variable globale que j'ai pu le faire. Mais
je ne peux pas le faire pour tout.

--
----
http://michael.moreno.free.fr/

1 2