Maison > Questions et réponses > le corps du texte
Un espace de noms sans nom ne peut pas être placé dans .h. Pouvez-vous donner un exemple de la raison pour laquelle cela n'est pas autorisé ?
Je n’ai trouvé aucun exemple après de longues délibérations.
PHPz2017-05-16 13:23:09
La clé dépend de la façon de l'utiliser et de ce qu'il faut mettre dans l'espace de noms sans nom. Par exemple, si vous mettez des variables, il y aura des problèmes.
//one.h
#include <iostream>
#include <typeinfo>
namespace {
class TestClass {
};
int i;
}
const std::type_info& one_get_TestClass_Info();
const std::type_info& two_get_TestClass_Info();
//one.cpp
#include "one.h"
const std::type_info& one_get_TestClass_Info()
{
i = 10;
std::cout << "val: " << i << " addr: " << &i << std::endl;
return typeid(TestClass);
}
//two.cpp
#include "one.h"
#include <iostream>
#include <typeinfo>
using namespace std;
const std::type_info& two_get_TestClass_Info()
{
std::cout << "val: " << i << " addr: " << &i << std::endl;
return typeid(TestClass);
}
//main.cpp
#include "one.h"
using namespace std;
int main()
{
const std::type_info& t1 = one_get_TestClass_Info();
const std::type_info& t2 = two_get_TestClass_Info();
std::cout << "one has type: " << t1.name() << '\n'
<< "two has type: " << t2.name() << '\n';
if (t1 == t2) {
cout << "same type";
}
return 0;
}
Le résultat est :
val: 10 addr: 0x602200
val: 0 addr: 0x602208
one has type: N12_GLOBAL__N_19TestClassE
two has type: N12_GLOBAL__N_19TestClassE
Pour un peu plus de détails, voir ici : https://zsounder.github.io/20….