(Dans la suite, le barré-à travers les choses sont des choses qui ne s'applique plus à C++11, mais ne s'appliquent à C++03. C++11 ne fait presque pas de différences plus (si il y en a, ils sont juste dans la langue de l'avocat différences dont je ne me souviens pas).).
Sans nom les espaces de noms sont un utilitaire pour faire un identificateur efficacement la traduction locale de l'unité. Ils se comportent comme si vous choisissez un nom unique par unité de traduction pour un espace de noms:
namespace unique { /* empty */ }
using namespace unique;
namespace unique { /* namespace body. stuff in here */ }
L'étape supplémentaire en utilisant le vide d'un corps est important, de sorte que vous pouvez déjà consulter dans l'espace de noms du corps à des identificateurs comme ::name
qui sont définies dans l'espace de noms, depuis l'aide de la directive a déjà eu lieu.
Cela signifie que vous pouvez avoir gratuitement les fonctions appelées (par exemple) help
qui peut exister dans plusieurs unités de traduction, et ils ne sera pas en conflit au moment de la liaison, car ils ont tous reçu un nom unique en raison de leur espace de noms unique, ils sont en. L'effet est presque identique à l'aide de l' static
de mots clés utilisés dans laquelle vous pouvez mettre dans la déclaration des identificateurs. static
utilisé de cette manière est déconseillée en C++, car sans nom les espaces de noms sont une alternative supérieure, pouvant même faire une conversion du type de l'unité locale.
namespace { int a1; }
static int a2;
Les deux a
s'sont la traduction locale de l'unité et ne sera pas en conflit au moment de la liaison. Mais la différence est que l' a1
en l'espace de noms anonymes seulement , se fait un nom unique. Il a toujours une liaison externe et peuvent être exportées dans la table des symboles du fichier de l'objet en cours de création. Cela devient important si vous voulez utiliser son adresse comme un argument de modèle:
template<int * ptr> struct sample { };
// OK - a1 has external linkage
sample<&a1> s1;
// NOT OK - translation unit locality is done by giving a2 internal linkage.
sample<&a2> s2;
Paramètres du modèle a avoir une liaison externe dans ce cas, l'identifiant doit être placée dans un espace de noms anonymes.
Lire l'excellent article au comeau-informatique "Pourquoi est un sans nom d'espace de noms utilisé à la place de statique?.