FAQ C++Consultez toutes les FAQ
Nombre d'auteurs : 34, nombre de questions : 368, dernière mise à jour : 14 novembre 2021 Ajouter une question
Cette FAQ a été réalisée à partir des questions fréquemment posées sur les forums de http://www.developpez.com et de l'expérience personnelle des auteurs.
Je tiens à souligner que cette FAQ ne garantit en aucun cas que les informations qu'elle propose sont correctes ; les auteurs font le maximum, mais l'erreur est humaine. Cette FAQ ne prétend pas non plus être complète. Si vous trouvez une erreur ou si vous souhaitez devenir rédacteur, lisez ceci.
Sur ce, nous vous souhaitons une bonne lecture.
Un namespace, ou espace de nom (parfois aussi espace de nommage, voire référentiel lexical) est une zone de déclaration d'identificateurs permettant au compilateur de résoudre les conflits de noms.
Si, par exemple, deux développeurs définissent des fonctions avec le même nom, il y aura un conflit lors de l'utilisation de ces fonctions dans un programme. Les espaces de nommage permettent de résoudre ce problème en ajoutant un niveau supplémentaire aux identificateurs.
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | namespace a { void toto() // première fonction toto { } } namespace b { void toto() // seconde fonction toto() { } } a::toto(); // appelle la première b::toto(); // appelle la seconde |
Code c++ : | Sélectionner tout |
1 2 | void mylib_fonction1(); void mylib_fonction2(); |
Code c++ : | Sélectionner tout |
1 2 3 4 5 | namespace mylib { void fonction1(); void fonction2(); } |
Un namespace anonyme est un espace de nom… sans nom.
Code c++ : | Sélectionner tout |
1 2 3 4 | namespace { int a; // variable déclarée dans un namespace anonyme } |
Parce qu'un namespace traduit mieux la notion de portée restreinte à un fichier, il est recommandé de privilégier son usage en C++ par-rapport à celui du mot-clé static utilisé dans le même but mais en C.
Si vous avez déclaré une classe ou des fonctions dans un espace de nom :
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | namespace ns { class Test { public: void F1(); void F2(); }; void Fonction1(); void Fonction2(); } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | namespace ns { void Test::F1() { } void Fonction1() { } } // autre possibilité void ns::Test::F2() { } void ns::Fonction2() { } |
Toute la bibliothèque standard C++ est définie dans son propre espace de nom, le namespace std. Ainsi, il faut systématiquement utiliser le préfixe std:: devant tous les éléments qui en sont issus.
Code c++ : | Sélectionner tout |
1 2 3 4 5 | #include <iostream> int main() std::cout << "cout" << std::endl; } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 | #include <iostream> using namespace std; int main() { cout << "coucou" << endl; } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | #include <iostream> void affiche_coucou() { using namespace std; // dans tout le corps de la fonction préfixer par std:: est facultatif cout << "coucou" << endl; } int main() { // ici il est obligatoire de préfixer par std:: affiche_coucou(); std::cout << "coucou" << std::endl; } |
Code c++ : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 | #include <iostream> using std::cout; using std::endl; int main() { // si on veut utiliser cin par exemple, il faudra écrire std::cin cout << "coucou" << endl; } |
Utiliser using namespace xxx; indique au compilateur qu'il a le droit, quand il voit un nom dans le reste de la portée courante, de le rechercher dans l'espace de nom xxx, ce qui peut alléger le code, en permettant d'écrire :
Code c++ : | Sélectionner tout |
1 2 3 | using namespace std; cout << hex << 42 << endl; |
Code c++ : | Sélectionner tout |
std::cout << std::hex << 42 << std::endl;
Par contre, cette écriture est à proscrire dans des fichiers d'en-tête, du moins à portée de fichier. En effet, le but des espaces de nom est de permettre d'éviter des collisions de nom entre deux objets qui auraient le même nom, mais provenant de deux sources différentes (et donc classés dans deux espaces de nom différents). L'utilisation de using est un raccourci, mais il n'est possible que si on sait qu'il n'y a pas de conflits. Si ce n'est pas le cas, il faut obligatoirement utiliser le nom qualifié des objets.
Or, dans le cadre d'un fichier d'en-tête, on ne peut pas savoir dans quels contextes ce fichier sera utilisé. Et comme il n'existe pas de commande qu'on puisse insérer pour dire d'arrêter d'utiliser un using, on risque si on utilise cette écriture dans un fichier d'en-tête de provoquer un conflit chez un de ses clients, qui n'aura aucun recours pour le corriger.
Proposer une nouvelle réponse sur la FAQ
Ce n'est pas l'endroit pour poser des questions, allez plutôt sur le forum de la rubrique pour çaLes sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2024 Developpez Developpez LLC. Tous droits réservés Developpez LLC. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents et images sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.