Les espaces de noms sans nom sont un utilitaire pour rendre une unité de traduction d'identifiant locale. Ils se comportent comme si vous choisissiez 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 utilisant le corps vide est importante, vous pouvez donc déjà faire référence dans le corps de l'espace de noms à des identifiants comme ::name
ceux définis dans cet espace de noms, car la directive using a déjà eu lieu.
Cela signifie que vous pouvez avoir des fonctions gratuites appelées (par exemple) help
qui peuvent exister dans plusieurs unités de traduction, et elles ne s'affronteront pas au moment de la liaison. L'effet est presque identique à l'utilisation du static
mot - clé utilisé en C que vous pouvez insérer dans la déclaration des identifiants. Les espaces de noms sans nom sont une alternative supérieure, pouvant même rendre une unité de traduction de type locale.
namespace { int a1; }
static int a2;
Les deux a
sont des unités de traduction locales et ne s'affronteront pas au moment du lien. Mais la différence est que a1
dans l'espace de noms anonyme obtient un nom unique.
Lisez l'excellent article de comeau-computing Pourquoi un espace de noms sans nom est-il utilisé au lieu de statique? ( Miroir Archive.org ).
Johannes Schaub - litb
la source
static
. Pouvez-vous également comparer avec__attribute__ ((visibility ("hidden")))
?Avoir quelque chose dans un espace de noms anonyme signifie qu'il est local pour cette unité de traduction (fichier .cpp et toutes ses inclusions), cela signifie que si un autre symbole portant le même nom est défini ailleurs, il n'y aura pas de violation de la règle de définition unique (ODR).
C'est la même chose que la manière C d'avoir une variable globale statique ou une fonction statique, mais elle peut également être utilisée pour les définitions de classe (et doit être utilisée plutôt qu'en
static
C ++).Tous les espaces de noms anonymes d'un même fichier sont traités comme le même espace de noms et tous les espaces de noms anonymes de différents fichiers sont distincts. Un espace de noms anonyme est l'équivalent de:
la source
L'espace de nom sans nom limite l'accès de la classe, de la variable, de la fonction et des objets au fichier dans lequel il est défini. La fonctionnalité d'espace de noms sans nom est similaire au
static
mot clé en C / C ++.static
Le mot-clé limite l'accès de la variable globale et de la fonction au fichier dans lequel elles sont définies.Il existe une différence entre un espace de noms sans nom et un
static
mot - clé, car l'espace de noms sans nom a un avantage sur statique.static
Le mot-clé peut être utilisé avec une variable, une fonction et des objets, mais pas avec une classe définie par l'utilisateur.Par exemple:
Mais,
Mais cela peut être possible avec un espace de noms sans nom. Par exemple,
la source
En plus des autres réponses à cette question, l'utilisation d'un espace de noms anonyme peut également améliorer les performances. Comme les symboles dans l'espace de noms n'ont besoin d'aucune liaison externe, le compilateur est plus libre pour effectuer une optimisation agressive du code dans l'espace de noms. Par exemple, une fonction qui est appelée plusieurs fois une fois dans une boucle peut être insérée sans aucun impact sur la taille du code.
Par exemple, sur mon système, le code suivant prend environ 70% du temps d'exécution si l'espace de noms anonyme est utilisé (x86-64 gcc-4.6.3 et -O2; notez que le code supplémentaire dans add_val fait que le compilateur ne veut pas inclure deux fois).
la source
-O3
à lui-même, puis vous avez dit que 3 contre 4 secondes sont "en même temps". ni l'un ni l'autre n'ont un peu de sens. je soupçonne que la véritable explication serait, mais qu'est-ce que c'est?L'exemple montre que les personnes du projet que vous avez rejoint ne comprennent pas les espaces de noms anonymes :)
Ceux-ci n'ont pas besoin d'être dans un espace de noms anonyme, car l'
const
objet a déjà une liaison statique et ne peut donc pas éventuellement entrer en conflit avec des identificateurs du même nom dans une autre unité de traduction.Et c'est en fait une pessimisation:
getState()
a un lien externe. Il est généralement préférable de préférer la liaison statique, car cela ne pollue pas la table des symboles. Il vaut mieux écrireici. Je suis tombé dans le même piège (il y a un libellé dans la norme qui suggère que les statiques de fichiers sont en quelque sorte déconseillées en faveur des espaces de noms anonymes), mais en travaillant dans un grand projet C ++ comme KDE, vous obtenez beaucoup de gens qui tournent la tête dans le bon sens autour de nouveau :)
la source
const
ness plus tard si vous le souhaitez. Je doute que cela signifie que l'équipe du PO "ne comprend rien"! En outre, le bit sur les fonctions dans les espaces de noms anonymes ayant une liaison externe est incorrect dans C ++ 11 et suivants, comme indiqué. D'après ce que je comprends, ils ont résolu un problème d'arguments de modèle nécessitant auparavant une liaison externe, ce qui pouvait permettre aux espaces de noms sans nom (capables de contenir des arguments de modèle) d'avoir une liaison interne.Un espace de noms anonyme rend les variables, fonctions, classes, etc. incluses uniquement disponibles dans ce fichier. Dans votre exemple, c'est un moyen d'éviter les variables globales. Il n'y a aucune différence de performances d'exécution ou de compilation.
Il n'y a pas tant d'avantages ou d'inconvénients que "Est-ce que je veux que cette variable, fonction, classe, etc. soit publique ou privée?"
la source