Em C++, é comum iniciarmos o código utilizando "using namespace std" após a declaração das bibliotecas:
#include <iostream>
using namespace std;
int main()
{
cout << "Hello world!" << endl;
}
Std vem da palavra "standard", que significa "padrão" em inglês. Ou seja, é como se estivéssemos utilizando uma biblioteca padrão da linguagem para fazermos operações e declarações, como variáveis, funções, structs, etc.
Mas afinal, o que é "Namespace"?
Namespaces são como pastas de organização no código, onde você guarda diferentes coisas. No exemplo acima, estamos usando a pasta padrão, onde colocamos as coisas que queremos usar em todo o código. Essas "pastas" geralmente são chamadas de escopo.
A necessidade de usar namespaces em um código pode gerar questionamentos, mas a resposta é direta. Através dessa palavra-chave, podemos evitar conflitos de nomes e usar os mesmos nomes para variáveis, funções e outros elementos de dados sem problemas. Em outras palavras, podemos utilizar o mesmo nome de um elemento para escopos diferentes. Isso torna o código eficiente para equipes que utilizam diversas bibliotecas criadas independentemente, evitando possíveis erros por conta de nomes iguais.
Como utilizo?
Uma forma de utilizar o namespace é declarando de forma similar a criação de classes, porém utilizando a palavra-chave namespace, e o nome do escopo que deseja, como veremos no exemplo abaixo:
using namespace std;
namespace NamespaceLocal {
int variavel = 5;
}
Para termos acesso a variável específica declarada dentro da NamespaceLocal, utilizaremos seu nome, dois "dois-pontos" (::) e o nome da variável:
int main() {
int variavel = 10;
cout << "Variavel global: " << variavel << endl;
cout << "Variavel local: " << LocalNamespace::variavel << endl;
return 0;
}
Percebe-se que dentro a função main, declaramos uma variável com o mesmo nome, mas com diferente valor. Essa variável está ligada ao namespace std, e pode ser acessada normalmente, como exemplificado na primeira saída. Já na segunda saída, a variável foi acessada de forma específica ao NamespaceLocal. A saída será essa:
Variavel global: 10
Variavel local: 5
Outra forma de especificar o escopo, é utilizando a palavra using dentro da função, e todo os dados a partir dessa palavra estará atrelado ao escopo especificado.
namespace primeiro_namespace{
void func(){
cout << "Dentro do primeiro_namespace" << endl;
}
}
namespace segundo_namespace{
void func(){
cout << "Dentro do segundo_namespace" << endl;
}
}
using namespace primeiro_namespace;
int main ()
{
func();
return 0;
}
Utilizamos dois namespaces distintos, cada um com uma função de mesmo nome. No entanto, antes de invocarmos a função, estabelecemos o escopo inicial usando using namespace, o que resulta na chamada exclusiva da função associada a esse escopo. A saída será essa:
Dentro do primeiro_namespace
Top comments (0)