DEV Community

Cover image for Uso de Namespaces
Ruthless
Ruthless

Posted on • Updated on

Uso de Namespaces

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;
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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;
}


Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Top comments (0)