Estou usando a declaração 'usando' em C ++ para adicionar std :: string e std :: vector ao namespace local (para evitar a digitação desnecessária de 'std ::' s).
using std::string;
using std::vector;
class Foo { /*...*/ };
Qual é o escopo desta declaração? Se eu fizer isso em um cabeçalho, ele injetará essas declarações de 'uso' em cada arquivo cpp que inclua o cabeçalho?
using
declaração (ouusing
diretiva) no escopo do arquivo em um arquivo / cabeçalho de inclusão! Isso causará dores de cabeça para os usuários do cabeçalho.using
declaração (a fortiori directiva ) em um cabeçalho em tudo , mesmo dentro de um namespace! Consulte o escopo do uso da declaração em um namespace para ver os problemas que isso causa.using
escopo de classe e função é seguro em relação ao problema discutido.Respostas:
Quando você #inclui um arquivo de cabeçalho em C ++, ele coloca todo o conteúdo do arquivo de cabeçalho no local em que você o incluiu no arquivo de origem. Portanto, incluir um arquivo que possui uma
using
declaração tem exatamente o mesmo efeito de colocar ausing
declaração no topo de cada arquivo que inclui esse arquivo de cabeçalho.fonte
using
declaração dentro de um,namespace
ela estará limitada ao escopo daquele namespace, então geralmente está OK (com as advertências usuais sobre suas necessidades e estilo específicos).Não há nada de especial nos arquivos de cabeçalho que impeçam a
using
declaração. É uma simples substituição de texto antes mesmo de começar a compilação.Você pode limitar uma
using
declaração a um escopo:fonte
using
dentro de uma função (ou mesmo umaTEST
macro gtest !) Torna minha vida muito melhor!O escopo da instrução using depende de onde ela está localizada no código:
fonte
using
instrução dentro do escopo da classe ...? Eu tive a mesma pergunta que o OP por causa disso, porque eu queria evitar digitar emstd::
todo lugar. Eu tenho classes que usam muitos vetores com ponteiros inteligentes e ostd::
prefixo de cinco caracteres adiciona muito comprimento de linha - o que eu acho pior. Então, eu queria saber se umausing
diretiva dentro do namespace contendo a classe estava ok? (Mesmo se dentro de um cabeçalho.)namespace { ... }
?O escopo é qualquer escopo em que a declaração de uso esteja.
Se for um escopo global, então será no escopo global. Se estiver no escopo global de um arquivo de cabeçalho, ele estará no escopo global de todos os arquivos de origem que incluem o cabeçalho.
Portanto, o conselho geral é evitar o uso de declarações no escopo global de arquivos de cabeçalho .
fonte
No caso citado, o arquivo (“unidade de tradução”), ou seja, todo arquivo que o contenha.
Você também pode colocar a instrução using dentro da classe; nesse caso, ela está em vigor apenas para aquela classe.
Geralmente, se você precisa especificar um namespace em um cabeçalho, geralmente é melhor apenas qualificar totalmente cada identificador necessário.
fonte
using
declaração em uma classe não se comporta da mesma maneira que fora de uma classe - por exemplo, você não pode usá-la para trazer emcout
vez destd::cout
para o escopo da classe.Está correto. O escopo é o módulo que usa a
using
declaração. Se qualquer arquivo de cabeçalho que um módulo inclui tiverusing
declarações, o escopo dessas declarações será aquele módulo, bem como quaisquer outros módulos que incluam os mesmos cabeçalhos.fonte
Existem alguns comentários que não são qualificados quando dizem "Não". Isso é muito severo, mas você tem que entender quando está OK.
Escrever
using std::string
nunca está bem. Escreverusing ImplementationDetail::Foo
em seu próprio cabeçalho, quando esse cabeçalho declara ImplementationDetail :: Foo pode ser OK, ainda mais se a declaração de uso acontecer em seu namespace. Por exemplofonte
MyNS::Foo
using boost::posix_time::ptime
. Claro que o usuário poderia escrever,MyNS::ptime
mas isso não é o fim do mundo e pode ser compensado pela conveniência de poder ter funções comoMyFunction(ptime a, ptime b)
.using std::string
nunca está bem? Mesmo em seu próprio namespace para salvar muitosstd::
prefixos?