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.
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).
"Marc Boyer" <Marc.Boyer@enseeiht.yahoo.fr.invalid> a écrit dans le message
de news: crtknn$ri5$3@news.cict.fr...
In article <mn.52657d51474d6eb0.21643@free.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).
"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).
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.
Christophe Lephay wrote:
"Marc Boyer" <Marc.Boyer@enseeiht.yahoo.fr.invalid> a écrit dans le message
de news: crtknn$ri5$3@news.cict.fr...
In article <mn.52657d51474d6eb0.21643@free.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.
"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.
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
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
- 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
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
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.
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
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
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
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
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
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
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