Utilise pour les espaces de noms dans les fichiers d'en-tête
Quelqu'un a affirmé sur DONC, aujourd'hui, que vous ne devez jamais utiliser anonyme espaces de noms dans les fichiers d'en-tête. Normalement, cela est correct, mais il me semble me rappeler une fois quelqu'un m'a dit que l'une des bibliothèques standard utilise anonyme espaces de noms dans les fichiers d'en-tête d'effectuer une initialisation.
Suis-je de rappeler correctement? Quelqu'un peut-il remplir dans les détails?
- Voir cette discussion: http://stackoverflow.com/questions/357404/anonynous-namespaces
- c'est le thread où il a obtenu des renseignements de la anonyme espaces de noms en-têtes est mauvais
- Je ne peux pas trouver quelque chose dans ce thread à propos de l'utiliser dans des fichiers d'en-tête. Quelqu'un peut-il expliquer pourquoi c'est mal? Et faut-il encore s'appliquer dans C++11?
Vous devez vous connecter pour publier un commentaire.
La seule situation dans laquelle un nom d'espace de noms en-tête peut être utile lorsque vous souhaitez distribuer code que les fichiers d'en-tête uniquement. Par exemple, un grand sous-ensemble autonome de Boost est purement en-têtes.
Le jeton
ignore
tuples, mentionné dans une autre réponse est un exemple, le_1
,_2
etc. lier les espaces réservés sont les autres.detail
.ignore
et_1
,_2
etc. sont les symboles publics - qu'ils n'appartiennent pas àdetail
. Mais je suis d'accord qu'un détail de l'espace de noms est normalement le bon choix pour un en-tête de la bibliothèque de l'équivalent d'un anonyme de l'espace de noms.namespace boost
? Quels sont les avantages de cette conférer?Je ne vois pas l'intérêt de mettre un anonyme, un espace de noms dans un fichier d'en-tête. J'ai grepped la norme et à la bibliothèque libstdc++ - têtes, n'a pas trouvé anonyme espaces de noms en dehors de l'un dans l'
tuple
d'en-tête C++1x trucs):C'est alors que vous pouvez faire
éléments de la some_tuple sont assignées aux variables du côté gauche (voir ici), une technique similaire est utilisée pour cette itérateur. Le deuxième élément est ignoré.
Mais comme ils le disent, il faut le mettre dans un .fichier cpp et une instance doit être partagé par tous les utilisateurs. Faire une déclaration de celui-ci dans l'en-tête comme celui-ci:
Je l'ai vu utilisé pour fournir une valeur par défaut pour une variable dans les différentes unités de traduction. Mais il pourrait provoquer un comportement inattendu dans le cas de collisions de noms.
Exemple
un.php
b.cpp
c.cpp
d.cpp
e.cpp
Je ne peux vraiment pas de voir les effets positifs de l'utilisation anonyme des espaces de noms dans les en-têtes. La confusion qui peut résulter de l'ayant le même symbole de la déclaration de dire, en substance, une chose différente dans les unités de compilation qui comprend l'en-tête serait un moyen sûr d'aller prématurément et douloureusement chauve.
Si c'est de l'initialisation, il serait probablement une
iostream
s de l'en-tête (commeistream
,ios
, etc.).