web-dev-qa-db-fra.com

Utilisations pour les espaces de noms anonymes dans les fichiers d'en-tête

Quelqu'un a affirmé sur SO aujourd'hui que vous ne devez jamais utiliser les espaces de noms anonymes dans les fichiers d'en-tête. Normalement, cela est correct, mais je semble vous rappeler une fois que quelqu'un m'a dit que l'une des bibliothèques standard utilise des espaces de noms anonymes dans l'en-tête fichiers pour effectuer une sorte d'initialisation.

Est-ce que je me souviens bien? Quelqu'un peut-il remplir les détails?

48
David Norman

La seule situation dans laquelle un espace de noms sans nom dans l'en-tête peut être utile est lorsque vous souhaitez distribuer du code comme des fichiers d'en-tête uniquement. Par exemple, un grand sous-ensemble autonome de Boost est purement en-têtes.

Le jeton ignore pour les tuples, mentionné dans une autre réponse est un exemple, le _1, _2, etc. Les espaces réservés de liaison sont d'autres.

25
James Hopkin

Je ne vois aucun point dans la mise en place d'un espace de noms anonyme dans un fichier d'en-tête. J'ai greppé les en-têtes standard et LibstDC++, n'ayant trouvé aucun espaces de noms anonymes en dehors d'un dans l'en-tête Tuple (C++ 1x trucs):

  // A class (and instance) which can be used in 'tie' when an element
  // of a Tuple is not required
  struct _Swallow_assign
  {
    template<class _Tp>
      _Swallow_assign&
      operator=(const _Tp&)
      { return *this; }
  };

  // TODO: Put this in some kind of shared file.
  namespace
  {
    _Swallow_assign ignore;
  }; // anonymous namespace

C'est ainsi que vous pouvez faire

std::tie(a, std::ignore, b) = some_Tuple;

les éléments du certains_Tupple sont attribués aux variables au côté gauche (voir ICI ), une technique similaire est utilisée pour Ceci Itérateur. Le deuxième élément est ignoré.

Mais comme on dit, il devrait être mis dans un fichier .CPP et l'instance doit être partagée par tous les utilisateurs. Ils mettraient une déclaration de celui-ci dans l'en-tête comme celui-ci alors:

extern _Swallow_assign ignore;
15

Je ne vois vraiment aucun avantage positif d'utiliser des espaces de noms anonymes dans les en-têtes. La confusion pouvant résulter d'avoir la même déclaration de symbole signifie, en substance, une chose différente dans les unités de compilation qui incluent cet en-tête serait une façon garantie d'aller prématurément et douloureusement chauve.

2
Jon Trauntvein

Si c'est l'initialisation, il s'agirait probablement d'un en-tête iostreams (comme istream, ios, etc.).

0
Max Lybbert