Namespaces em C++

Jinku Hu 12 outubro 2023
  1. Use a palavra-chave namespace para criar um novo namespace em C++
  2. Use namespaces aninhados para implementar escopos complexos em C++
Namespaces em C++

Este artigo explicará como usar namespaces em C++.

Use a palavra-chave namespace para criar um novo namespace em C++

C++ tem o conceito de namespaces que ajudam a prevenir um problema comum em grandes projetos chamados conflitos de nomes. Quando o projeto fornecido usa diferentes bibliotecas desenvolvidas por equipes independentes e tem muitos nomes globais para diferentes objetos, torna-se inevitável que alguns nomes correspondam e causem erros. O namespace declara um escopo onde certos nomes de funções ou outros objetos são definidos. Lembre-se de que existem regras de escopo automáticas em C++ que controlam como os nomes dos objetos são vistos e disponíveis em diferentes regiões de código. Por exemplo, a variável local declarada na função não é vista ou acessível fora do corpo da função. Portanto, outra variável com o mesmo nome pode ser declarada fora do corpo desta função sem nenhum conflito. Por outro lado, temos um único escopo global, que é frequentemente utilizado por grandes programas para disponibilizar certos objetos nos arquivos ou funções. Agora, imagine como o espaço sem qualquer mecanismo manual de definição de escopo pode ser gerenciado.

Na verdade, os programadores costumavam lidar com a colisão de nomes usando nomes muito longos para objetos globais. Ele pode funcionar para projetos de tamanho relativamente pequeno, mas torna a leitura do código um tanto confusa, e a solução ainda não pode evitar colisões de nomes sem um esquema de nomenclatura coordenado.
Os namespaces fornecem um mecanismo para particionar um escopo global (conseqüentemente chamado de namespace). Um namespace é declarado com a palavra-chave namespace seguida pelo próprio nome do namespace. Em seguida, segue o código entre chaves semelhantes ao bloco de funções e termina sem ponto-e-vírgula. As mesmas regras de escopo automáticas governam as variáveis ​​em um namespace como outras partes do código. Os nomes de objetos que precisam ser acessados ​​de fora do namespace precisam começar com o nome do namespace no qual foram definidos, seguido pela notação de dois pontos duplos e, em seguida, o nome do objeto. O exemplo de código a seguir demonstra o caso de uso básico para os namespaces no mesmo arquivo.

C
++ cCopy#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

int main() {
  int var1 = 123;

  cout << var1 << endl;
  cout << dinno::var1 << endl;

  return EXIT_SUCCESS;
}

Resultado:

 textCopy123
456

Use namespaces aninhados para implementar escopos complexos em C++

Os namespaces podem ser aninhados, de forma semelhante às instruções de loop. Por padrão, um namespace aninhado tem acesso aos nomes de objetos no namespace externo, mas o último (geralmente chamado de namespace pai) não pode acessar os membros no namespace interno. Embora, seja possível especificar a palavra-chave inline antes da declaração do namespace interno para tornar seus membros acessíveis no namespace pai. Os namespaces podem ser definidos em locais diferentes. Ou seja, a mesma definição de namespace pode abranger arquivos diferentes ou locais separados em um único arquivo, pois os namespaces dinno são definidos no exemplo a seguir.

C
++ cCopy#include <iostream>

using std::cout;
using std::endl;

namespace dinno {
int var1 = 456;
}

namespace gini {
int var1 = 980;

namespace bean {
int var1 = 199;
}
}  // namespace gini

namespace dinno {
int var2 = 990;
}

int var1 = 123;

int main() {
  cout << var1 << endl;
  cout << dinno::var1 << endl;
  cout << gini::var1 << endl;
  cout << dinno::var2 << endl;
  cout << gini::bean::var1 << endl;

  return EXIT_SUCCESS;
}

Resultado:

 textCopy123
456
980
990
199
Autor: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook