 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michael Moreno Guest
|
Posted: Mon Jan 10, 2005 10:13 am Post subject: variable static |
|
|
Bonjour,
Dans un .cpp, je ne vois pas la difference entre
static int MaVariable = 0;
et
int MaVariable2 = 0;
Il me semble que :
- Les deux variables sont accessibles uniquement depuis le .cpp.
- Les deux variables existent durant l'execution du programme.
Pourriez-vous s'il vous plait me dire quelle est la difference ?
Merci.
Michael
--
----
http://michael.moreno.free.fr/
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Mon Jan 10, 2005 10:17 am Post subject: Re: variable static |
|
|
In article <mn.52657d51474d6eb0.21643 (AT) free (DOT) fr>, Michael Moreno wrote:
| Quote: | Bonjour,
Dans un .cpp, je ne vois pas la difference entre
static int MaVariable = 0;
et
int MaVariable2 = 0;
Il me semble que :
- Les deux variables sont accessibles uniquement depuis le .cpp.
|
non
| Quote: | - Les deux variables existent durant l'execution du programme.
|
oui
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.
|
|
| Back to top |
|
 |
Christophe Lephay Guest
|
Posted: Mon Jan 10, 2005 10:28 am Post subject: Re: variable static |
|
|
"Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> a écrit dans le message
de news: crtknn$ri5$3 (AT) news (DOT) cict.fr...
| Quote: | In article <mn.52657d51474d6eb0.21643 (AT) free (DOT) fr>, Michael Moreno wrote:
Bonjour,
Dans un .cpp, je ne vois pas la difference entre
static int MaVariable = 0;
et
int MaVariable2 = 0;
Il me semble que :
- Les deux variables sont accessibles uniquement depuis le .cpp.
non
|
Fainéant ! Tu aurais pu expliquer qu'une déclaration extern int MaVariable2;
la rendait accessible dans chaque .cpp (où aurait lieu cette déclaration).
|
|
| Back to top |
|
 |
Marc Boyer Guest
|
Posted: Mon Jan 10, 2005 10:34 am Post subject: Re: variable static |
|
|
Christophe Lephay wrote:
| Quote: | "Marc Boyer" <Marc.Boyer (AT) enseeiht (DOT) yahoo.fr.invalid> a écrit dans le message
de news: crtknn$ri5$3 (AT) news (DOT) cict.fr...
In article <mn.52657d51474d6eb0.21643 (AT) free (DOT) fr>, Michael Moreno wrote:
Bonjour,
Dans un .cpp, je ne vois pas la difference entre
static int MaVariable = 0;
et
int MaVariable2 = 0;
Il me semble que :
- Les deux variables sont accessibles uniquement depuis le .cpp.
non
Fainéant ! Tu aurais pu expliquer qu'une déclaration extern int MaVariable2;
la rendait accessible dans chaque .cpp (où aurait lieu cette déclaration).
|
Sauf que le extern étant l'option par défaut, une déclaration
int MaVariable2 suffit.
En fait, je ne sais pas présenter la chose simplement. Et puis bon,
c'est pas présenté même dans les plus mauvais cours de C ?
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.
|
|
| Back to top |
|
 |
xavier Guest
|
Posted: Mon Jan 10, 2005 12:09 pm Post subject: Re: variable static |
|
|
Michael Moreno a dis le 10/01/2005 11:13:
| Quote: | static int MaVariable = 0;
int MaVariable2 = 0;
- Les deux variables sont accessibles uniquement depuis le .cpp.
|
Non.
En déclarant une variable "static", tu donne l'instruction au
compilateur de ne permettre l'accès à cette variable que dans l'unité de
compilation (le .cpp) dans lequel elle est déclarée.
Sans "static", la variable est implicitement déclarée "extern", et toute
unité de compilation (autre .cpp) peut y accèder.
Du fait que le langage C++ oblige tout élément à être déclaré avant
d'être accèdé, une déclaration de type "extern int MaVariable2;" est
nécéssaire dans chaque unité de compilation qui souhaite accèder à cette
variable.
Note que, en C++, on privilègie désormais l'utilisation d'espace de nom
anonyme pour définir des variables privées à une unité de compilation :
namespace {
int MaVariable = 0;
}
plutôt que de déclarer des variables statiques. Ceci, je pense, pour
éviter de polluer l'espace de nommage courant.
Pour résumer :
// definition.cpp
static int MaVariable = 0;
int MaVariable2 = 0;
namespace {
int MaVariable3 = 0;
}
//eof
// autre_unite.cpp
extern int MaVariable;
extern int MaVariable2;
namespace {
extern int MaVariable3;
}
int main() {
MaVariable = 1; // erreur de lien
MaVariable2 = 1; // OK
MaVariable3 = 1; // erreur de lien
}
//eof
$ g++ -o mtest definition.cpp autre_unite.cpp
/tmp/cc6xbaaa.o(.text+0x2c):autre_unite.cpp: undefined reference to
`MaVariable'
/tmp/cc6xbaaa.o(.text+0x40):autre_unite.cpp: undefined reference to
`(anonymous namespace)::MaVariable3'
collect2: ld returned 1 exit status
xavier
|
|
| Back to top |
|
 |
Michael Moreno Guest
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Mon Jan 10, 2005 8:30 pm Post subject: Re: variable static |
|
|
xavier wrote:
| Quote: | Note que, en C++, on privilègie désormais l'utilisation d'espace de nom
anonyme pour définir des variables privées à une unité de compilation :
namespace {
int MaVariable = 0;
}
plutôt que de déclarer des variables statiques. Ceci, je pense, pour
éviter de polluer l'espace de nommage courant.
|
Je pense qu'un argument était que static fait déjà 50 choses
différentes, et que si on pouvait lui allèger son travail, il ne s'en
porterait que mieux.
--
Loïc
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Jan 10, 2005 9:24 pm Post subject: Re: variable static |
|
|
Michael Moreno wrote:
| Quote: | Dans un .cpp, je ne vois pas la difference entre
static int MaVariable = 0;
et
int MaVariable2 = 0;
Il me semble que :
- Les deux variables sont accessibles uniquement depuis le .cpp.
- Les deux variables existent durant l'execution du programme.
Pourriez-vous s'il vous plait me dire quelle est la difference ?
|
La différence se présente si tu as deux variables du même nom
dans des modules différentes. Sans le statique, le nom de la
variable est connu de l'éditeur de liens, une définition
identique dans une autre unité de compilation, et tu as une
erreur lors de l'édition de liens (typiquement -- en ce qui
concerne la norme, c'est un comportement indéfini). Et tu peux
déclarer le nom extern dans une autre unité de compilation, et
accéder à la définition non statique.
Avec le mot clé static, le nom de la variable ne sort pas de
l'unité de compilation. (Au moins en ce qui concerne le
programme ; il pourrait bien apparaître des les symboles du
déboggage.)
--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Mon Jan 10, 2005 9:27 pm Post subject: Re: variable static |
|
|
Loïc Joly wrote:
| Quote: | xavier wrote:
Note que, en C++, on privilègie désormais l'utilisation
d'espace de nom anonyme pour définir des variables privées à
une unité de compilation :
namespace {
int MaVariable = 0;
}
plutôt que de déclarer des variables statiques. Ceci, je
pense, pour éviter de polluer l'espace de nommage courant.
Je pense qu'un argument était que static fait déjà 50 choses
différentes, et que si on pouvait lui allèger son travail, il
ne s'en porterait que mieux.
|
Je crois que l'argument absolu, c'est que le static ne marchait
que sur des variables et des fonctions. Il n'y avait pas de
moyen de rendre un nom de classe « invisible » en dehors de
l'unité de compilation.
Par la suite, évidemment, il y a des arguments de orthogonalité.
On ne va pas se servir d'un namespace anonyme pour une classe,
et static pour une fonction, quand même.
--
James Kanze home: www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| 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
|
|