102 votes

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

Y a-t-il une différence entre encapsuler à la fois le contenu de l'en-tête et du fichier cpp dans un espace de noms ou encapsuler uniquement le contenu de l'en-tête et ensuite utiliser l'espace de noms dans le fichier cpp?

Par différence, je veux dire toute pénalité de performance de tri ou sémantique légèrement différente qui peut causer des problèmes ou tout ce dont je dois être conscient.

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?

60voto

Roee Gavirel Points 4550

La différence entre "namespace X" et "using namespace X" est dans la première toute nouvelle déclaration sera sous l'espace de noms alors que dans la seconde elle ne le sera pas.

Dans votre exemple, il n'y a pas de nouvelle déclaration - donc pas de différence donc pas de voie préférée.

44voto

vprajan Points 421

L'espace de noms est juste un moyen de modifier la signature d'une fonction afin qu'elle n'entre pas en 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 au moment de la compilation. Notez que les espaces de noms ne sont qu'une entité de temps de compilation.

Le seul problème qui se pose avec l'utilisation de l'espace de noms est lorsque nous avons les mêmes noms d'espaces de noms imbriqués (c'est-à-dire) X :: X :: Foo. Quoi qu'il en soit, cela crée plus de confusion avec ou sans mot clé.

8voto

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

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

1voto

bert-jan Points 735

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

1voto

revani Points 532

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

Mais pour les problèmes de conception, le deuxième est horrible. Même s'il compile (pas sûr), cela n'a aucun sens.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X