web-dev-qa-db-fra.com

Création d'un espace de noms C++ dans l'en-tête et la source (cpp)

Existe-t-il une différence entre encapsuler les contenus d'en-tête et de fichier cpp dans un espace de noms ou encapsuler uniquement le contenu d'en-tête et ensuite using namespace dans le fichier cpp?

Par différence, j'entends toute pénalité de performances ou une sémantique légèrement différente qui peut causer des problèmes ou des problèmes que je dois connaître.

Exemple:

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
namespace X
{
  void Foo::TheFunc()
  {
    return;
  }
}

CONTRE

// header
namespace X
{
  class Foo
  {
  public:
    void TheFunc();
  };
}

// cpp
using namespace X;
{
  void Foo::TheFunc()
  {
    return;
  }
} 

S'il n'y a pas de différence, quelle est la forme préférée et pourquoi?

70
links77

L'espace de noms n'est qu'un moyen de modifier la signature de la fonction pour éviter tout conflit. Certains préfèrent la première façon et d'autres préfèrent la deuxième version. Les deux versions n’ont aucun effet sur les performances de compilation. Notez que les espaces de noms ne sont qu'une entité de compilation.

Le seul problème qui se pose lors de l’utilisation de l’espace de noms est lorsque nous avons les mêmes noms d’espaces de noms imbriqués (i.e) X::X::Foo. Cela crée plus de confusion avec ou sans mot-clé.

32
vprajan

La différence entre "espace de noms X" et "utilisant l'espace de noms X" est dans la première, les nouvelles déclarations seront sous l'espace de noms, alors que dans le second, il n'en sera rien. 

Dans votre exemple, il n'y a pas de nouvelle déclaration - donc pas de différence donc pas de solution privilégiée. 

42
Roee Gavirel

Il n'y a pas de pénalité de performances, car le résultat pourrait être le même, mais placer votre Foo dans un espace de noms introduit implicitement une ambiguïté dans le cas où vous avez Foos dans différents espaces de noms. Vous pouvez obtenir votre code fubar, en effet. Je recommanderais d'éviter d'utiliser using à cette fin.

Et vous avez un { errant après using namespace ;-)

Si le second compile également, il ne devrait y avoir aucune différence. Les espaces de noms sont traités au moment de la compilation et ne devraient pas affecter les actions d'exécution.

Mais pour les problèmes de conception, la seconde est horrible. Même si ça compile (pas sûr), ça n'a aucun sens.

1
holgac

Le Foo :: TheFunc () n'est pas dans l'espace de nom correct dans le cas du VS. Utilisez 'void X :: Foo :: TheFunc () {}' pour implémenter la fonction dans l'espace de nom correct (X). 

1
bert-jan

Dans le cas où vous n'emballez que le contenu .h, vous devez écrire en utilisant un espace de noms ... dans un fichier cpp, sinon vous travaillez à chaque fois sur l'espace de noms valide. Normalement, vous enveloppez les fichiers .cpp et .h, sinon vous risquez d'utiliser des objets d'un autre espace de noms, ce qui peut générer de nombreux problèmes.

0
AlexTheo

Je pense que la bonne chose à faire ici est d'utiliser l'espace de noms pour la portée.

namespace catagory
{
    enum status
    {
      none,
      active,
      paused
    }
};

void func()
{
    catagory::status status;
    status = category::active;
}
0
Kjetil Hvalstrand