En actualisant la sémantique subtilement différente en raison de l'ADL, comment dois-je généralement l'utiliser using
et pourquoi? Est-ce dépendant de la situation (par exemple, en-tête qui sera #include
d contre fichier source qui ne le sera pas)?
De plus, devrais-je préférer ::std::
ou std::
?
Au niveau de l'espace de noms
using namespace
:using namespace std; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Être pleinement explicite:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { return std::make_pair(s.begin(), s.end()); }
Déclarations d'utilisation au niveau de l'espace de noms:
using std::pair; using std::string; pair<string::const_iterator, string::const_iterator> f(const string &s) { return make_pair(s.begin(), s.end()); }
Fonction en utilisant les déclarations locales:
std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using std::make_pair; return make_pair(s.begin(), s.end()); }
Fonction locale
using namespace
:std::pair<std::string::const_iterator, std::string::const_iterator> f(const std::string &s) { using namespace std; return make_pair(s.begin(), s.end()); }
Autre chose?
Cela suppose une pré-C ++ 14, et donc pas de déduction de type retour en utilisant auto
.
::std::
rapport àstd::
bien.std
sans seconde cependant. Quelqu'un définissant un espace de noms std demande des problèmes (et cherche probablement à tirer profit de ce que la plupart des gens utilisentstd
et non::std
).Réponses:
Évitez d'utiliser
using
dans les en-têtes, car cela rompt le but des espaces de noms.Il est correct de l'utiliser dans les fichiers source, mais je l'éviterais quand même dans certains cas (par exemple
using std
).Cependant, si vous avez des espaces de noms imbriqués, c'est ok:
la source
using
mot - clé sans expliquer en détail pourquoi les espaces de noms sont utilisés au départ.using std::cout
et amis, mais ce n'est pas comme si c'étaitcout
déjà un nom horriblement long.Lorsque vous placez une instruction using dans un fichier source, S'IL VOUS PLAÎT, insérez simplement les éléments dont vous avez besoin. Par exemple:
Le problème ici est que si vous le faites
vous tirez CHAQUE SINGLE THING de std dans l'espace de noms global. Ce qui conduit à des messages d'erreur très intéressants lorsque vous utilisez accidentellement un nom dans votre code qui correspond à celui que vous ignoriez complètement dans std. Si vous insérez simplement ce que vous voulez, vous n'aurez pas ce problème (ou, plus précisément, le prochain programmeur à travailler sur votre code n'aura pas ce problème).
la source
using namespace
simplement dans une étendue de fonction, en évitant le problème.Comme l'indique VJovic, ne l'utilisez pas
using
dans un fichier d'en-tête.using
dans un fichier d'en-tête affecte l'unité de compilation actuelle (le fichier .cpp) d'une manière que le fichier source peut ne pas attendre.using namespace
est également à éviter dans un fichier source. Cela met chaque symbole dans la même portée que le fichier source. Vos lecteurs savent plus clairement ce que vous faites si vous utilisez des symboles spécifiques de l'espace de noms.la source
using namespace JoystickModule
au début d'un fichier .cpp queJoystickModule::
attaché à chaque objet.using
déclaration pour mon propre espace de noms sur lequel je travaille actuellement et tout le reste reste à espace de noms.using SomeNameSpace::SomeSymbol
. Cela évite de déplacer chaque symbole de l'espace de noms dans la portée actuelle.L'écriture
using
dans les en-têtes est le meilleur moyen de créer toutes sortes de bugs désagréables et impossibles à déboguer . Ne fais pas ça.Écrire
using namespace XYZ
dans le fichier source est un peu mieux, mais peut toujours vous causer d'innombrables maux de tête. Le moyen sûr est de spécifier explicitement ce que vous utilisez, par exempleusing Foo::Bar
.Disons que vous avez Bar.cpp avec les éléments suivants:
La fonction a bien fonctionné, jusqu'à ce qu'un jour - apparemment sans aucun changement de code dans les classes pertinentes - son comportement ait changé: Soudain,
currentIndex
il semble toujours être désactivé par un . En fouillant dans les changements récents, vous ne découvrez aucun changement, même à distance, lié au code.Finalement, vous découvrez la cause:
vous (indirectement) incluez
Foo.h
quelque part. Dans les fichiers de l'espace de noms Foo, une nouvelle fonction a été ajoutée:Ce qui correspond sans aucun doute mieux
increment(int)
que votre fonctionincrement(double)
- alors maintenant, laFoo::increment()
fonction est appelée parBar::someFunction()
. Oups.(Et si vous deviez écrire des
using
en-têtes quiusing namespace Foo
pourraient très bien se trouver n'importe où dans votre arbre d'inclusion ...)Alors ... N'en écrivez pas
using
dans les en-têtes, et méfiez-vous également de l'écritureusing namespace
dans les fichiers source.la source