Je suis d'accord avec tout. Greg a écrit mais j'aimerais ajouter : Ça peut même être pire que ce que Greg a dit !
La bibliothèque Foo 2.0 pourrait introduire une fonction, Quux()
qui correspond mieux, sans ambiguïté, à certains de vos appels à Quux()
que le bar::Quux()
votre code a été appelé pendant des années. Puis votre le code compile toujours mais il appelle silencieusement la mauvaise fonction et fait Dieu sait quoi. C'est à peu près aussi mauvais que les choses peuvent devenir.
N'oubliez pas que le std
possède des tonnes d'identifiants, dont beaucoup sont des muy communs (pensez list
, sort
, string
, iterator
) qui sont très susceptibles d'apparaître dans d'autres codes également.
Si vous considérez que c'est peu probable : Il y avait une question posée ici, sur Stack Overflow, où il s'est passé à peu près exactement la même chose (mauvaise fonction appelée en raison d'une omission std::
préfixe) environ une demi-année après avoir donné cette réponse. Ici est un autre exemple, plus récent, d'une telle question. Il s'agit donc d'un véritable problème.
Voici un autre point de données : Il y a de très nombreuses années, je trouvais également ennuyeux de devoir préfixer tout ce qui provenait de la bibliothèque standard par le terme std::
. J'ai ensuite travaillé sur un projet où il avait été décidé dès le départ que les deux using
Les directives et les déclarations sont interdites, sauf pour la portée des fonctions. Devinez quoi ? Il n'a fallu que quelques semaines à la plupart d'entre nous pour s'habituer à écrire le préfixe, et après quelques semaines supplémentaires, la plupart d'entre nous étaient même d'accord sur le fait que cela rendait le code plus lisible . Il y a une raison à cela : Que vous aimiez une prose plus courte ou plus longue est subjectif, mais les préfixes ajoutent objectivement de la clarté au code. Non seulement le compilateur, mais vous aussi, trouvez plus facile de voir à quel identifiant il est fait référence.
En une décennie, ce projet a atteint plusieurs millions de lignes de code. Comme ces discussions reviennent sans cesse, j'ai été un jour curieux de savoir combien de fois le champ d'application de la fonction (autorisé) using
a été utilisé dans le projet. J'ai parcouru les sources pour le trouver et je n'ai trouvé qu'une ou deux douzaines d'endroits où il était utilisé. Pour moi, cela indique que, une fois essayé, les développeurs ne trouvent pas std::
assez douloureux pour employer des directives d'utilisation même une fois tous les 100 kLoC, même lorsque son utilisation était autorisée.
La ligne du bas : Préfixer tout explicitement ne fait pas de mal, demande très peu d'habitude et présente des avantages objectifs. En particulier, cela rend le code plus facile à interpréter par le compilateur et par les lecteurs humains - et cela devrait probablement être l'objectif principal quand on écrit du code.
596 votes
N'oubliez pas que vous pouvez faire : "using std::cout ;" ce qui signifie que vous n'avez pas besoin de taper std::cout, mais que vous n'avez pas besoin d'utiliser tout l'espace de noms std en même temps.
77 votes
Il est particulièrement mauvais d'utiliser 'using namespace std' à la portée du fichier dans les fichiers d'en-tête. L'utiliser dans les fichiers sources (*.cpp) au niveau du fichier après toutes les inclusions n'est pas aussi mauvais, car son effet est limité à une seule unité de traduction. Son utilisation à l'intérieur de fonctions ou de classes est encore moins problématique, car son effet est limité à la portée de la fonction ou de la classe.
8 votes
Je déconseille l'utilisation de la directive using mais pour des espaces de noms spécifiques tels que
std::literals::chrono_literals
,Poco::Data:Keywords
,Poco::Units
et des trucs qui traitent des littéraux ou des astuces de lisibilité. Chaque fois que c'est dans les fichiers d'en-tête ou d'implémentation. Cela peut être acceptable dans la portée d'une fonction, je suppose, mais en dehors des littéraux et autres, ce n'est pas utile.0 votes
@sh- Pourquoi suggérez-vous qu'il est "particulièrement mauvais" d'utiliser "using namespace std" ?
13 votes
@Jon : Cela n'a rien à voir avec le namespace std en particulier. Je voulais mettre l'accent sur "à la portée du fichier dans les fichiers d'en-tête". Pour le dire comme un conseil : N'utilisez pas "using namespace" (std ou autre) à la portée du fichier dans les fichiers d'en-tête. Il est possible de l'utiliser dans les fichiers d'implémentation. Désolé pour l'ambiguïté.
1 votes
C'est seulement considéré comme une mauvaise pratique dans les en-têtes. Elle est acceptable dans les fichiers sources qui ne sont pas inclus ailleurs (par exemple, les fichiers cpp). Voir la réponse de @mattnewport ci-dessous. stackoverflow.com/a/26722134/125997