OVH Cloud OVH Cloud

variable static

8 réponses
Avatar
Michael Moreno
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/

8 réponses

Avatar
Marc Boyer
In article , 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

- 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.

Avatar
Christophe Lephay
"Marc Boyer" a écrit dans le message
de news: crtknn$ri5$
In article , 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).


Avatar
Marc Boyer
Christophe Lephay wrote:
"Marc Boyer" a écrit dans le message
de news: crtknn$ri5$
In article , 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.



Avatar
xavier
Michael Moreno a dis le 10/01/2005 11:13:
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

Avatar
Michael Moreno
Merci beaucoup.

--
----
http://michael.moreno.free.fr/
Avatar
Loïc Joly
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.

--
Loïc

Avatar
James Kanze
Michael Moreno wrote:

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

Avatar
James Kanze
Loïc Joly wrote:
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