Vincent Robert a raison dans son commentaire Comment utilisez-vous correctement les espaces de noms en C ++? .
Utiliser l'espace de noms
Les espaces de noms sont utilisés à tout le moins pour éviter la collision de noms. En Java, cela est imposé par l'idiome "org.domain" (car il est supposé que l'on n'utilisera rien d'autre que son propre nom de domaine).
En C ++, vous pouvez donner un espace de noms à tout le code de votre module. Par exemple, pour un module MyModule.dll, vous pouvez donner à son code l'espace de nom MyModule. J'ai vu ailleurs quelqu'un utiliser MyCompany :: MyProject :: MyModule. Je suppose que c'est exagéré, mais dans l'ensemble, cela me semble correct.
Utiliser "en utilisant"
L'utilisation doit être utilisée avec le plus grand soin car elle importe efficacement un (ou tous) symboles d'un espace de noms dans votre espace de noms actuel.
C'est mal de le faire dans un fichier d'en-tête car votre en-tête polluera toutes les sources y compris (cela me rappelle les macros ...), et même dans un fichier source, mauvais style en dehors d'une portée de fonction car il importera à portée globale les symboles de l'espace de noms.
La façon la plus sûre d'utiliser "à l'aide de" est d'importer certains symboles:
void doSomething()
{
using std::string ; // string is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
std::cout << a << std::endl ;
}
void doSomethingElse()
{
using namespace std ; // everything from std is now "imported", at least,
// until the end of the function
string a("Hello World!") ;
cout << a << endl ;
}
Vous verrez beaucoup de "using namespace std;" dans des tutoriels ou des exemples de codes. La raison est de réduire le nombre de symboles pour faciliter la lecture, non pas parce que c'est une bonne idée.
"using namespace std;" est découragé par Scott Meyers (je ne me souviens pas exactement quel livre, mais je peux le trouver si nécessaire).
Composition de l'espace de noms
Les espaces de noms sont plus que des packages. Un autre exemple peut être trouvé dans "Le langage de programmation C ++" de Bjarne Stroustrup.
Dans la "Special Edition", au 8.2.8 Composition des espaces de noms , il décrit comment vous pouvez fusionner deux espaces de noms AAA et BBB en un autre appelé CCC. Ainsi, CCC devient un alias pour AAA et BBB:
namespace AAA
{
void doSomething() ;
}
namespace BBB
{
void doSomethingElse() ;
}
namespace CCC
{
using namespace AAA ;
using namespace BBB ;
}
void doSomethingAgain()
{
CCC::doSomething() ;
CCC::doSomethingElse() ;
}
Vous pouvez même importer des symboles sélectionnés à partir de différents espaces de noms, pour créer votre propre interface d'espace de noms personnalisée. Je n'ai pas encore trouvé une utilisation pratique de cela, mais en théorie, c'est cool.
std
espace de noms aux symboles plutôt qu'à utiliserusing
du tout. Donc j'écris toujoursstd::cout
oustd::string
maintenant parce que c'est comme ça que je les appelle maintenant. Je n'écrirais jamaiscout
.