initialisation static

initialisation static - C++ - Programmation

Marsh Posté le 21-09-2010 à 12:27:16    

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
Reply

Marsh Posté le 21-09-2010 à 12:27:16   

Reply

Marsh Posté le 21-09-2010 à 13:30:57    

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
Reply

Marsh Posté le 21-09-2010 à 13:37:33    

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
Reply

Marsh Posté le 21-09-2010 à 13:41:16    

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++
Reply

Marsh Posté le 21-09-2010 à 13:51:11    

Citation :

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


 
Mea cupla

Reply

Marsh Posté le 21-09-2010 à 13:59:30    

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
Reply

Marsh Posté le 21-09-2010 à 14:07:59    

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)
Reply

Marsh Posté le 21-09-2010 à 14:33:27    

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
Reply

Marsh Posté le 21-09-2010 à 15:12:24    

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

Reply

Marsh Posté le 21-09-2010 à 15:31:06    

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
Reply

Marsh Posté le 21-09-2010 à 15:31:06   

Reply

Marsh Posté le 21-09-2010 à 15:37:35    

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
Reply

Marsh Posté le 21-09-2010 à 17:06:11    

et si on faisait pas de variable globale hein :€

Reply

Marsh Posté le 21-09-2010 à 17:19:30    

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
Reply

Marsh Posté le 21-09-2010 à 22:57:27    

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 :€

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed