Namespaces em C++
-
Use a palavra-chave
namespace
para criar um novo namespace em C++ - Use namespaces aninhados para implementar escopos complexos 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.
++ 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.
++ 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
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