C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

variable static

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Michael Moreno
Guest





PostPosted: Mon Jan 10, 2005 10:13 am    Post subject: variable static Reply with 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.
- 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





PostPosted: Mon Jan 10, 2005 10:17 am    Post subject: Re: variable static Reply with quote



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





PostPosted: Mon Jan 10, 2005 10:28 am    Post subject: Re: variable static Reply with 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...
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





PostPosted: Mon Jan 10, 2005 10:34 am    Post subject: Re: variable static Reply with quote

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





PostPosted: Mon Jan 10, 2005 12:09 pm    Post subject: Re: variable static Reply with quote

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





PostPosted: Mon Jan 10, 2005 12:42 pm    Post subject: Re: variable static Reply with quote

Merci beaucoup.

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

Back to top
Loïc Joly
Guest





PostPosted: Mon Jan 10, 2005 8:30 pm    Post subject: Re: variable static Reply with quote

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





PostPosted: Mon Jan 10, 2005 9:24 pm    Post subject: Re: variable static Reply with quote

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





PostPosted: Mon Jan 10, 2005 9:27 pm    Post subject: Re: variable static Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.