Est-il acceptable d'ajouter un « espace de noms à l'aide » immédiatement après la déclaration d'espace de nom?
-
22-08-2019 - |
Question
J'ai un petit espace de noms contenant des définitions de type, que j'utilise pour faire mon propre look de code. Cependant, je ne veux pas avoir à ajouter un « espace de noms à l'aide ... » ligne pour chaque fichier qui utilise un de ces types, après tout ce que je l'ai déjà ajouter un #include pour le fichier.
MonFichier.cpp:
#include "typedefs.h"
void Bob()
{
IntList^ list = gcnew IntList;
}
typedefs.h:
namespace Typedefs
{
typedef List<int> IntList;
typedef array<int> IntArray;
typedef List<Byte> ByteList;
typedef array<Byte> ByteArray;
typedef List<String^> StringList;
typedef array<String^> StringArray;
}
using namespace Typedefs;
Serait-il acceptable d'ajouter la ligne « en utilisant l'espace de noms » immédiatement après la déclaration d'espace de nom? Sinon, pourquoi pas?
La solution
Utilisez unnamednamespace.If vous voulez avoir les noms visibles uniquement aux fichiers que vous avez inclus les en-têtes
namespace {
int i = 10;
}
ci-dessus a le même effet que le code ci-dessous comme
namespace randomName {
int i = 10;
}
using randomName;
donc rien ne sera accessible à partir de tout autre fichier.
Autres conseils
Il est possible, mais je ne pense pas qu'il soit sage. Il défaites seulement le but de l'espace de noms en exposant son contenu partout. Si vous voulez que le confort de ne pas avoir à spécifier Typedefs::
ou using Typedefs::xxx;
ou using namespace Typedefs;
je tout simplement pas créer un espace de nom du tout.
Mettre un 'espace de noms à l'aide XXX;' directive dans un fichier d'en-tête est généralement considéré comme une mauvaise idée, comme il le fait vaincre l'idée d'avoir un espace de noms en premier lieu. Il peut facilement conduire à ce genre de conflits de noms que l'introduction d'un espace de noms est censé éviter.
Mon conseil - ne le faites pas, si nécessaire, les coller dans les fichiers source appropriés (Cpp) à la place
.Vous pourriez aussi bien définir vos nouveaux types en dehors de tout espace de noms, ou suis-je manque quelque chose?