Question

Lorsque vous utilisez les espaces de noms C ++, préférez-vous les nommer explicitement, comme suit:

std::cout << "Hello, world!\n";

Ou préférez-vous en utilisant un espace de noms :

using namespace std;
cout << "Hello, world!\n";

Et si vous préférez cette dernière, déclarez-vous vos utilisations au niveau du fichier ou de la fonction?

Personnellement, je préfère les nommer explicitement - c’est plus typé, mais lorsqu’on utilise plusieurs espaces de noms (par exemple, std et boost ), je le trouve plus lisible.

Était-ce utile?

La solution

J'utilise toujours en utilisant l'espace de noms pour std & amp; renforcer. Pour tout le reste, j'ai tendance à utiliser un espace de noms explicite, à moins qu'il ne soit utilisé tellement qu'il encombrerait le code.

Dans les en-têtes, je n’utilise jamais utilisant un espace de noms pour éviter de polluer l’espace de noms global de la source #including.

Autres conseils

La frappe supplémentaire n’est pas le problème ici. Le problème avec les noms explicitement qualifiés est le fouillis visuel. Let's face it, la syntaxe C ++ est désordonnée. Inutile d’aggraver les choses en allongeant inutilement les noms et en saupoudrant généreusement le code de :: s.

Je suis avec Jeff Atwood: Le meilleur code est sans code . C’est tellement vrai.

Les importations d'espaces de noms sont un excellent moyen de réduire l'encombrement sans inconvénient: tant que la portée des espaces de noms ouverts est réduite à une seule unité de compilation 1 , les conflits de noms, s'ils apparaissent, peuvent être résolus facilement.

Pourquoi les noms explicites devraient (en général) être plus lisibles a toujours été un mystère pour moi. Les lecteurs doivent généralement connaître le code suffisamment bien pour pouvoir déduire la sémantique. S'ils ne le sont pas, le code doit quand même être corrigé.

1) Corollaire: aucun n'utilise dans les en-têtes!

J'utilise toujours les explicites. Ecrire std ne me fait pas mal et je vois bien d'où ça vient. C'est utile lorsque vous avez un projet hérité à gérer avec ses propres "chaînes", "vecteurs". etc pour maintenir. Plus le code contient d'informations, mieux c'est.

Ma règle générale est toujours d'utiliser explicitement l'espace de noms dans les en-têtes et d'utiliser généralement avec dans le code. La première raison est de préciser explicitement dans chaque partie de la définition ce qui est utilisé, et la seconde est que cela facilite l'utilisation de remplacements à partir d'un autre espace de nom si cela devient nécessaire. Par exemple, si nous voulons commencer à utiliser foo :: string au lieu de std :: string, nous devons simplement mettre à jour l'en-tête et l'instruction using plutôt que de remplacer chaque instance de std :: string par foo :: string dans le code.

Bien sûr, cela est moins utile pour les classes résidant dans l’espace std :: namespace, car même si vous remplacez une classe, vous utiliserez probablement d’autres classes dans std, ce qui risque de poser des problèmes d’ambiguïté. un exemple.

utilisant et en utilisant l'espace de noms sont très très utiles pour rendre le code plus lisible - supprimez l'encombrement.

Mais dans tous les cas où il est difficile de savoir d'où provient un symbole, je refuse d'importer l'intégralité de son espace de noms.

J'essaie de limiter la portée des espaces de noms importés:

void bar() {

   // do stuff without vector

   { using std::vector;
      // do stuff with vector
   }

   // do stuff without vector
}

Pour "généralement connu" bibliothèques, comme std , j'oserais utiliser en utilisant namespace std . Il y a des raisons de croire que tous ceux qui lisent ce code connaissent ces symboles.

En résumé, le mot clé utilisant est également utilisé pour indiquer qu'une classe dérivée exporte également les membres surchargés de sa superclasse.

class A {
  void f( A  );
  void f( bool );
};

class B : public A {
  using A::f; // without this, we get a compilation error in foo()
  void f(bool);
};

void foo() {
  B b;
  b.f( A() ); // here's a compilation error when no `using` is used in B
}

Je n'utilise les espaces de noms explicites que lorsqu'il y a une ambiguïté. Il est plus lisible, mais la frappe supplémentaire est trop fastidieuse et vous devez supposer que les autres développeurs ont une connaissance de base des bibliothèques standard.

Les seules autres fois où j'épelle un espace de noms sont lorsque je ne l'utilise qu'une ou deux fois, comme pour ajouter une instruction de débogage rapide, ou si j'utilise une bibliothèque non standard.

Je déclare généralement l'espace de nom à la portée du fichier, mais si vous mélangez des espaces de nom, il peut être judicieux de rapprocher la déclaration de son point d'utilisation, dans l'étendue de la fonction.

en utilisant dans la portée de la fonction, ou si la fonction est très petite (c'est souvent le cas), il suffit d'un espace de noms explicite

J'ai tendance à importer explicitement les noms dont j'ai besoin en haut du fichier .cpp, donc ...

using std :: cout; using std :: endl;

etc ...

De cette façon, j'ai le contrôle sur les noms que j'utilise et il est facile de voir d'où ils viennent et le code n'est pas encombré au moment de l'utilisation.

Dans les rares cas où j'utilise deux noms d'espaces de noms différents, je les qualifie complètement au moment de leur utilisation.

J'utilise toujours des noms qualifiés complets dans les en-têtes et je n'utilise presque jamais 'using namespace x' '...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top