Pergunta

Um dos caprichos do meu sistema de desenvolvimento (Codegear C ++ Builder) é que alguns dos cabeçalhos gerados automaticamente insistem em ter ...

using namespace xyzzy

... declarações nelas, que impactam meu código quando eu menos quero ou espero.

Existe uma maneira de cancelar/substituir uma instrução anterior "usando" para evitar isso.

Pode ser...

unusing namespace xyzzy;
Foi útil?

Solução

Não. Mas há uma solução em potencial: se você inclui sua diretiva de inclusão em um espaço para nome próprio, como este ...

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

... Então, os efeitos de qualquer uso de diretrizes nesse cabeçalho são neutralizados.

Isso pode ser problemático em alguns casos. É por isso que todo guia do estilo C ++ recomenda fortemente não Colocando uma diretiva "usando namespace" em um arquivo de cabeçalho.

Outras dicas

Não, você não pode não utilizado um espaço para nome. A única coisa que você pode fazer é colocar o using namespace-State um bloco para limitar seu escopo.

Exemplo:

{
    using namespace xyzzy;

} // stop using namespace xyzzy here

Talvez você possa alterar o modelo usado dos seus cabeçalhos gerados automaticamente.

Você pode ficar preso usando namespaces explícitos em conflitos:

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

Para referência futura: Como a versão XE, há um novo valor que você pode #Define para evitar o temido using namespace System; int incluem: delphiheader_no_implicic_namespace_use

Que tal usar o SED, Perl ou alguma outra ferramenta de linha de comando como parte do seu processo de construção para modificar os cabeçalhos gerados após serem gerados, mas antes de serem usados?

Experiência rápida com o Visual Studio 2005 mostra que você pode incluir esses cabeçalhos no seu próprio nome nomeado e depois use o que você precisa deste espaço para nome (mas não use Todo o espaço para nome, pois introduzirá o espaço para nome que você deseja ocultar.

#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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top