web-dev-qa-db-fra.com

Comment "désutiliser" un espace de noms?

L'un des aléas de mon système de développement (Codegear C++ Builder) est que certains des en-têtes générés automatiquement insistent pour avoir ...

using namespace xyzzy

... des instructions qui ont un impact sur mon code quand je le veux ou l'attends le moins.

Existe-t-il un moyen d'annuler/remplacer une instruction "using" précédente pour éviter cela?.

Peut être...

unusing namespace xyzzy;
76
Roddy

Nan. Mais il y a une solution potentielle: si vous enfermez votre directive include dans un espace de noms qui lui est propre, comme ceci ...

namespace codegear {
    #include "codegear_header.h"
} // namespace codegear

... alors les effets de toute directive using dans cet en-tête sont neutralisés.

Cela pourrait être problématique dans certains cas. C'est pourquoi chaque guide de style C++ recommande fortement pas de placer une directive "using namespace" dans un fichier d'en-tête.

56
Head Geek

Non, vous ne pouvez pas ne pas utiliser un espace de noms. La seule chose que vous pouvez faire est de mettre le using namespace- énonce un bloc pour limiter sa portée.

Exemple:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Vous pouvez peut-être modifier le modèle utilisé pour vos en-têtes générés automatiquement.

46
jk.

Vous pouvez être bloqué en utilisant des espaces de noms explicites sur les conflits:

string x; // Doesn't work due to conflicting declarations
::string y; // use the class from the global namespace
std::string z; // use the string class from the std namespace
15
Eclipse

Pour référence future: depuis la version XE, il existe une nouvelle valeur que vous pouvez # définir pour éviter le redouté using namespace System; dans l'inclusion: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

10
cdelacroix

Que diriez-vous d'utiliser sed, Perl ou un autre outil de ligne de commande dans le cadre de votre processus de génération pour modifier les en-têtes générés après leur génération mais avant leur utilisation?

7
Arkadiy

Une expérience rapide avec Visual Studio 2005 montre que vous pouvez enfermer ces en-têtes dans votre propre espace de noms nommé puis use ce dont vous avez besoin de cet espace de noms (mais pas use tout l'espace de noms, comme il le fera présente l'espace de noms que vous souhaitez masquer.

1
Kasprzol