Question

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

using namespace xyzzy

... des déclarations qui ont un impact sur mon code lorsque je le souhaite ou que je l'attends le moins.

Existe-t-il un moyen d’annuler ou de remplacer un précédent " en utilisant " déclaration pour éviter cela.

Peut-être ...

unusing namespace xyzzy;
Était-ce utile?

La solution

Nope. Mais il y a une solution potentielle: si vous incluez votre directive include dans un espace de noms propre, comme ceci ...

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

... alors les effets de toute directive d'utilisation de cet en-tête sont neutralisés.

Cela pourrait être problématique dans certains cas. C’est pourquoi chaque guide de style C ++ recommande vivement de ne pas mettre un "utilisant un espace de noms". directive dans un fichier d'en-tête.

Autres conseils

Non, vous ne pouvez pas utiliser un espace de noms. La seule chose que vous pouvez faire est de placer dans le utilisant un espace de noms -statement un bloc pour en limiter la portée.

Exemple:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Peut-être pouvez-vous changer le modèle utilisé pour vos en-têtes générés automatiquement.

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

Pour référence future: depuis la version XE, il existe une nouvelle valeur que vous pouvez #define pour éviter le redouté en utilisant l'espace de noms System; dans l'inclinaison suivante: DELPHIHEADER_NO_IMPLICIT_NAMESPACE_USE

Pourquoi ne pas utiliser sed, perl ou un autre outil de ligne de commande dans le cadre de votre processus de construction pour modifier les en-têtes générés après leur génération mais avant leur utilisation?

Une expérimentation rapide avec Visual Studio 2005 montre que vous pouvez inclure ces en-têtes dans votre propre espace de nom nommé, puis utiliser ce dont vous avez besoin dans cet espace de nom (sans utiliser l'ensemble de l'espace de noms, car il introduit l'espace de noms que vous souhaitez masquer.

#include<iostream>
#include<stdio.h>
namespace namespace1 {
    int t = 10;
}
namespace namespace2 {
    int t = 20;
}
int main() {
using namespace namespace1;
    printf("%d" , t);
    printf("%d" , namespace2::t);
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top