Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1219 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  initialisation static

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

initialisation static

n°2024112
in_your_ph​ion
Posté le 21-09-2010 à 12:27:16  profilanswer
 

bonjour,
j'ai un programme où j'initialise une variable statique dans un header:

 
Code :
  1. namespace logger {
  2. static bool doLog = false;
  3. }
 

plus tard, dans mon programme je modifie cette variable à la valeur 'true'.

 

et encore plus tard, dans un autre fichier, je fais un test sur cette variable

 
Code :
  1. if (logger::doLog) { /* ... */ }
 

mais bizarrement la valeur est toujours 'false'. Comment c'est possible ?  :??:

 

merci par avance


Message édité par in_your_phion le 21-09-2010 à 12:30:02
mood
Publicité
Posté le 21-09-2010 à 12:27:16  profilanswer
 

n°2024123
roondar
Posté le 21-09-2010 à 13:30:57  profilanswer
 

Peut être par ce que "static" signifie statique ! (Si tu veux modifier ta valeur, enlève le mot clef "static" )

Message cité 1 fois
Message édité par roondar le 21-09-2010 à 13:31:58
n°2024124
esox_ch
Posté le 21-09-2010 à 13:37:33  profilanswer
 

roondar a écrit :

Peut être par ce que "static" signifie statique ! (Si tu veux modifier ta valeur, enlève le mot clef "static" )


 
Absolument pas  :sarcastic: . Static ça signifie que l'emplacement mémoire alloué à cette variable sera toujours le même.
 
Exemple :
 

Code :
  1. void incr(void)
  2. {
  3. static int a=0;
  4. std::cout << ++a <<std::endl;
  5. }
  6.  
  7.  
  8. inc(); // Affichera 1
  9. inc(); // Affichera 2


 
Tu confonds static et const roondar.
 
in_your_phion, tu peux nous dire dans quel fichier la variable est déclarée, dans quel fichier elle est modifiée et dans quel fichier tu y accèdes, et comment ils sont liés entre eux?


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
n°2024125
h3bus
Troll Inside
Posté le 21-09-2010 à 13:41:16  profilanswer
 

Attention static a deux sens en C/Cpp et dans ce cas là, il signifie que le scope de la variable est limité à l'entité compilée (le fichier en gros).

 

Si tu l'initialise dans le header, tu auras une variable par entité, et donc si tu en modifie une, l'autre, inclue dans l'autre fichier ne bouge pas.

Message cité 2 fois
Message édité par h3bus le 21-09-2010 à 13:42:11

---------------
sheep++
n°2024127
roondar
Posté le 21-09-2010 à 13:51:11  profilanswer
 

Citation :

Absolument pas  :sarcastic: . Static ça signifie que l'emplacement mémoire alloué à cette variable sera toujours le même.


 
Mea cupla

n°2024129
sligor
Posté le 21-09-2010 à 13:59:30  profilanswer
 

h3bus a écrit :

Attention static a deux sens en C/Cpp et dans ce cas là, il signifie que le scope de la variable est limité à l'entité compilée (le fichier en gros).
 
Si tu l'initialise dans le header, tu auras une variable par entité, et donc si tu en modifie une, l'autre, inclue dans l'autre fichier ne bouge pas.


voilà, donc tu crées une nouvelle variable à chaque inclusion du .h
 
ce qu'il faut faire c'est:
extern int doLog // dans le .h
 
int doLog // dans un .cpp


---------------
qwerty-fr
n°2024131
Un Program​meur
Posté le 21-09-2010 à 14:07:59  profilanswer
 

h3bus a écrit :

Attention static a deux sens en C/Cpp


 
Le mot cle static est utilisable dans trois contextes:
 
static a portee de fichier -> +- la meme chose que de mettre dans un namespace anonyme (meme s'il y a des differences techniques qui font que l'usage de static n'est pas redondant avec un namespace anonyme), visible uniquement que pour le fichier
static a portee de classe -> un exemplaire du membre pour la classe (pour les membres donnees), appelable sans objet (pour les membres fonctions)
static a portee de fonction -> garde sa valeur d'un appel a l'autre de la fonction
 
Dans le namespace l'OP est dans le premier cas.


---------------
The truth is rarely pure and never simple (Oscar Wilde)
n°2024140
theshockwa​ve
I work at a firm named Koslow
Posté le 21-09-2010 à 14:33:27  profilanswer
 

attention aussi au mélange de bilbiothèques statiques et dynamiques, quand on manipule des variable "static". Il y a risque de duplication dans les différentes bibliothèques dynamiques.


---------------
last.fm
n°2024147
in_your_ph​ion
Posté le 21-09-2010 à 15:12:24  profilanswer
 

sligor a écrit :


voilà, donc tu crées une nouvelle variable à chaque inclusion du .h
 
ce qu'il faut faire c'est:
extern int doLog // dans le .h
 
int doLog // dans un .cpp


 
yea! merci c'est exactement ça! j'ai viré le statique et mis du extern.
 
peut on faire un extern const ? et si oui comment initialiser
 
cheers

n°2024152
sligor
Posté le 21-09-2010 à 15:31:06  profilanswer
 

in_your_phion a écrit :


 
yea! merci c'est exactement ça! j'ai viré le statique et mis du extern.
 
peut on faire un extern const ? et si oui comment initialiser
 
cheers


explicite ce que tu veux faire avec ce extern const ;), ça a un rapport avec le code précédent ?


---------------
qwerty-fr
mood
Publicité
Posté le 21-09-2010 à 15:31:06  profilanswer
 

n°2024155
theshockwa​ve
I work at a firm named Koslow
Posté le 21-09-2010 à 15:37:35  profilanswer
 

in_your_phion a écrit :


 
yea! merci c'est exactement ça! j'ai viré le statique et mis du extern.
 
peut on faire un extern const ? et si oui comment initialiser
 
cheers


 
 
tu initialises à l'initialisation (le CPP qui contient effectivement la variable) et non pas à la déclaration (les extern). Que ce soit const ou pas, l'initialisation ne change pas.


---------------
last.fm
n°2024190
Joel F
Real men use unique_ptr
Posté le 21-09-2010 à 17:06:11  profilanswer
 

et si on faisait pas de variable globale hein :€

n°2024195
sligor
Posté le 21-09-2010 à 17:19:30  profilanswer
 

un logger c'est typiquement le cas où on peux utiliser un singleton. (sinon c'est à éviter le plus possible bien sûr)

 

Sauf que pour utiliser un singleton c'est déjà bien de d'abord comprendre comment fonctionne les bases du langage (static, const, extern ...) ...

Message cité 1 fois
Message édité par sligor le 21-09-2010 à 17:20:04

---------------
qwerty-fr
n°2024313
Joel F
Real men use unique_ptr
Posté le 21-09-2010 à 22:57:27  profilanswer
 

sligor a écrit :

un logger c'est typiquement le cas où on peux utiliser un singleton. (sinon c'est à éviter le plus possible bien sûr)
 
Sauf que pour utiliser un singleton c'est déjà bien de d'abord comprendre comment fonctionne les bases du langage (static, const, extern ...) ...


 
je parlais pas de singleton, je parlais de variable global tt court :€


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  initialisation static

 

Sujets relatifs
[Static Control] NOWORDWRAPInitialisation d'une pile de réseaux de neurones.
question sur static et multithreadInitialisation dans une fonction d'une matrice de pointeur
Initialisation de tableaupb initialisation port parallele Python
lib shared, optim facon static ?static_cast<> mal compris ?
FUNCTOR vs staticInitialisation complexe d'une variable globale ("code static")
Plus de sujets relatifs à : initialisation static


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR