On m'a dit qu'il est mauvais d'avoir "à l'aide d'un espace de noms ns123" dans un fichier d'en-tête, mais je ne me souviens pas de la raison. Est-ce en fait une mauvaise chose à faire et pourquoi? P>
5 Réponses :
Cela vous donnera souvent des erreurs de compilation étranges et mystérieuses, pour une chose, où vous pouvez passer des heures à essayer de comprendre la racine du problème. P>
tirer toutes les classes et les fonctions hors de leur espace de noms est généralement une mauvaise idée et est en fait opposé au concept d'espaces de noms ... il est généralement préférable d'utiliser "en utilisant" sur une classe ou une fonction spécifique. P>
Ce n'est pas aussi mauvais dans un fichier .CPP, cependant, car vous ignorez les espaces de noms dans une zone locale. Dans un fichier .h, vous ignorez les espaces de noms dans une zone nombreuse et non bien définie.
C'est une mauvaise pratique, en général, car il défait le but des espaces de noms. En définissant dans une en-tête, vous n'ubliez pas un contrôle strict sur la portée de l'utilisation de la déclaration, ce qui signifie que vous pouvez rencontrer des affrontements de nom dans des endroits inattendus. P>
Parlez-vous de directives ou de déclarations? Ou les deux?
Si vous mettez un en utilisant la déclaration code> dans un fichier d'en-tête, tout ce que
#include code> s le fichier d'en-tête a également importé l'espace de noms, qu'ils le souhaitent ou non. Cela viole le principe de la moins surprise et défaite le but des espaces de noms en permettant la modification d'une instruction code> #include code> pour provoquer facilement une collision de nommage. Si vous souhaitez importer un espace de noms dans votre propre fichier .CPP pour enregistrer un peu de frappe et produire un code plus lisible, c'est bien. Il suffit de ne pas forcer les utilisateurs de votre module à faire de même. P>
à l'aide d'un espace de noms n; code> est une directive à l'aide de la directive, pas une déclaration d'utilisation. Une déclaration utilisant peut être appropriée, car elle n'affecte que le nom spécifié au lieu de tout et de tout en N, si c'est ce qui est souhaité. (
à l'aide de N :: nom; code> est un exemple en utilisant la déclaration.)
Programmation C ++ ordinaire forte> p>
Oui, il y a souvent des endroits où cela a du sens et que vous avez le contrôle de l'endroit où et comment vous utilisez votre utilisation de Stamenets. S'il s'agit d'un programme avec une périmètre limitée, vous n'avez pas à vous soucier de vous soucier de votre place dans la portée mondiale. p>
Pour les applications monolithiques, je serais Je dirais qu'il est parfaitement acceptable de commencer à mettre en place des déclarations au niveau 3 ou 4 - c'est-à-dire où les chances de collisions commencent à devenir très faibles. p>
Programmation générique / TMP forte> p>
dans la programmation générique et le TMP en utilisant est souvent utilisé pour configurer vos bibliothèques pour un domaine spécifique et cela se fait souvent via des déclarations. p>
Vous l'avez laissé non déclaré mais je pense que vous vouliez dire (et toutes les réponses actuelles supposons) que vous parlez d'utiliser des directives à la portée mondiale dans un en-tête. Dans les champs non globaux (par exemple dans l'espace de noms sur lequel vous exercez un contrôle complet ou à l'intérieur d'une fonction), vous obtiendrez une réponse différente.
Cette question serait mieux si elle répondait à la préoccupation soulevée par Roger Pate.