Bonjour,

J'ai "resolu" aujourd'hui (sans doute par un coup de chance...) un soucis que j'avais et qui a fortement attise ma curiosite. Je vais reproduire en simplifie le soucis ici afin de poser ma question :p

Voici un header (file.hh)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef FILE_HH
# define FILE_HH
 
namespace ns
{
 
  namespace
  {
    int var = 0;
  } // namespace
 
  void incrVar();
 
  void foo();
 
} // namespace ns
 
# include "file.hxx"
 
#endif // !FILE_HH
La fonction 'ns::incrVar()' est inline. Elle incremente 'var' et affiche sa nouvelle valeur (file.hxx)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#ifndef FILE_HXX
# define FILE_HXX
 
# include <iostream>
 
# include "file.hh"
 
namespace ns
{
 
  inline
  void
  incrVar()
  {
    ++var;
    std::cout << "incrVar(): " << var << std::endl;
  }
 
} // namespace ns
 
#endif // !FILE_HXX
Et enfin, la fonction 'ns::foo()', qui ne fait qu'afficher la valeur de 'var' (file.cc)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
 
#include "file.hh"
 
namespace ns
{
 
  void
  foo()
  {
    std::cout << "foo(): " << var << std::endl;
  }
 
} // namespace ns
Faisons des tests avec une fonction 'main()' (main.cc)
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
 
#include "file.hh"
 
int
main()
{
  ns::incrVar();
  ns::incrVar();
  ns::incrVar();
  ns::foo();
}
Pas de warning ni d'erreur a la compilation, alors c'est parti...

Si l'on m'avait pose la question "Quel sera le contenu de la sortie standard ?", j'aurais sans hesite repondu :
Code : S�lectionner tout - Visualiser dans une fen�tre � part
1
2
3
4
incrVar(): 1
incrVar(): 2
incrVar(): 3
foo(): 3
... Et je me serais trompe : la valeur de 'var' affichee par ns::foo() est '0' (et non '3').
Pour que 'ns::foo()' affiche '3', il aurait fallu que 'ns::incrVar()' soit dans le .cc, et donc pas inline. (Dans ce cas, on aurait un warning pour une variable non utilisee, mais ca "fonctionnerait").

Donc la, pour moi, ca devient assez bizarre : une variable dans un namespace anonyme serait accessibe dans le header et les sources, mais n'aurait pas la meme valeur dans le .hh (ou .hxx) et dans le .cc ??

Il y a tres certainement une explication... et c'est ce que je vous demande ici

Merci d'avance ^^ (C'est pas presse, c'est de la curiosite :p)


PS : desole pour les accents :s