Considere as duas declarações escalares a seguir em um escopo global, no programa a seguir:
#incluir
usando namespace std;
int varid = 5;
Float varid = 2.3;
int main ()
retornar 0;
Uma tentativa de compilar este programa leva a um erro de compilação. Existem duas variáveis com o mesmo nome, variado. Embora sejam duas variáveis diferentes de dois tipos diferentes, int e flutuador, o compilador rejeita as duas declarações porque são de mesmo nome. O programa a seguir resolve esse problema declarando as variáveis com o mesmo nome em dois escopos generalizados diferentes:
#incluir
usando namespace std;
namespace na
int varid = 5;
namespace nb
Float varid = 2.3;
int main ()
cout << NA::varId << '\n';
cout << NB::varId << '\n';
retornar 0;
A saída é a seguinte:
5Existem dois espaços de nome no programa acima: N / D, que tem a definição de um número inteiro e Nb, que tem a definição de flutuação, mas com o mesmo nome que o número inteiro para NA. Finalmente, quando o programa foi executado, o mesmo nome para duas variáveis diferentes foi usado. Observe que, para acessar o mesmo nome de duas variáveis diferentes, o nome específico do espaço para nome deve ser usado, seguido pelo identificador comum. O nome de namespace e o identificador comum são separados pelo operador de resolução de escopo, “::.O nome dos espaços para nome diferenciará os objetos.
Este artigo cobre o conceito básico de um espaço para nome e seu uso na linguagem de programação C ++. Para seguir este artigo, você deve ter um conhecimento básico da linguagem C ++. Você também deve ter conhecimento do escopo C ++, embora seja explicado brevemente neste artigo. Para saber mais sobre o escopo C ++, procure a frase "Escopo em C ++" (sem cotações) na caixa de pesquisa de qualquer Linuxhint.com a página da web e pressione Enter. Isso o levará ao artigo que este autor escreveu.
Conteúdo do artigo
O que é um espaço para nome?
Uma região declarativa é a maior parte de um programa em que o nome de uma entidade (variável) é válido. Esta região é chamada de escopo. Um espaço para nome em C ++ é um escopo generalizado cujo principal objetivo é resolver conflitos de nome. Um espaço para nome tem declarações básicas e/ou definições de entidades.
Namespace global e seu problema
O espaço para nome global é o escopo global. Considere o seguinte programa curto:
#incluir
usando namespace std;
int identd = 55;
Float Ident = 12.17;
int main ()
retornar 0;
No programa acima, existem duas variáveis, ambas chamadas ident. Essas variáveis estão no escopo global; isto é, eles estão no espaço de nome global. Uma tentativa de compilar este programa falhará com uma mensagem de erro. O escopo global não aceita mais de uma variável com o mesmo nome, então é necessário um espaço para nome personalizado.
Namespace personalizado
Um espaço para nome não tem apenas um nome. Em vez disso, um espaço para nome tem um conjunto de nomes para evitar conflitos com outros conjuntos de nomes. Para evitar conflitos mais baixos no código, precede cada nome com o nome do espaço para nome e :: . O programa a seguir ilustra isso usando dois namespaces personalizados:
#incluir
usando namespace std;
namespace na
int varint = 6;
flutuar;
namespace nb
int varint = 7;
flutuar;
int main ()
cout << NA::varInt << '\n';
cout << NB::varInt << '\n';
NA :: FLT = 2.5;
NB :: FLT = 4.8;
cout << NA::flt << '\n';
cout << NB::flt << '\n';
retornar 0;
A saída é:
6Observe que os nomes NA :: FLT e NB :: FLT finalmente foram definidos no principal() função. C ++ não permite essa definição no escopo global.
Observe que o espaço para nome personalizado é um espaço de nome aninhado para o espaço para nome global.
A diretiva usando
Para evitar digitar “Namepace :: Name” o tempo todo, em vez de apenas “nome” depois de declarar o espaço para nome, você pode usar o usando diretivo. A sintaxe para usar o usando A diretiva é a seguinte:
usando namespace namespace_name;
O usando A diretiva não é uma diretiva de pré -processador, por isso termina com um semicolon (;).
O programa a seguir ilustra o uso do usando diretiva e mais:
#incluir
usando namespace std;
namespace nb
int varint = 7;
int func ()
devolver varint;
int fn ()
usando namespace nb;
int myvar2 = func ();
// outros objetos e funções do NB seguem.
retornar myvar2;
int myvar3 = nb :: func ();
int main ()
cout << fn() << " << myVar3 << '\n';
retornar 0;
A saída deste programa é 7 7. O termo "usando namespace nb;”Foi colocado no início do fn () definição. O func () Do namespace da NB é chamado logo abaixo disso, sem preceder com “NB ::.”
Uma variável declarada no escopo global (espaço para nome global) é visto do ponto de declaração até o final do arquivo. Também é visto nos namespaces aninhados (escopos aninhados), como os aninhados fn () Escopo de função acima. O usando a diretiva se junta ao seu espaço para nome da posição em que é colocado no final do escopo em que é colocado.
O nome func () do espaço para nome da NB não pode ser visto abaixo do fn () definição porque “usando namespace nb; ” foi colocado dentro do escopo da função (bloco). Sob esta condição, para usar “func ()”Fora do namespace nb Block (SCOPE), ele deve ser precedido por“NB ::,”Como na seguinte declaração:
int myvar3 = nb :: func ();
O usando A diretiva se junta ao seu espaço para nome de nome de ninho externo da posição em que é colocado no final do espaço para nome de ninho externo. No programa seguinte, o namespace NA é unido ao espaço de nome global. Os dois namespaces se estendem para o fn () Namespace de definição de função, no qual eles se juntam ao espaço para nome da NB. O espaço para nome da NB termina no final do fn () Definição da função, e os dois espaços de nome anteriores continuam até o final do arquivo (leia o código).
#incluir
usando namespace std;
namespace na
int varint = 6;
int func ()
devolver varint;
namespace nb
int varint = 7;
int func ()
devolver varint;
usando namespace Na;
int myvar0 = varint;
// Outros objetos e funções de :: e nb seguem.
int fn ()
int myvar1 = varint;
usando namespace nb;
int myvar2 = nb :: func ();
// Outros objetos e funções da NB seguem, até o final deste escopo.
retornar myvar1 + myvar2;
// Somente objetos e funções de :: e nb seguem.
int myvar3 = nb :: func ();
int main ()
cout << myVar0 << " <<
fn () << " << myVar3 <<
'\ n';
retornar 0;
A saída é 6, 13, 7.
Observação: O espaço para nome global é indicado com :: , o que significa que não há nada antes do operador de resolução do escopo que segue.
Abaixo da declaração, o “usando namespace Na;”Variáveis dos namespaces globais e de NA podem ser usados sem uma indicação de seu espaço de nome de fonte. A próxima declaração usa o Varint do espaço para nome da NA. A região de namespace global e NA combinada se estende para o fn () namespace de funções. Então o Varint da primeira declaração no fn () escopo da função, é do espaço de nome de NA.
Desde a região para os nomes globais e de NA se estendem por todo o fn () escopo, depois do “int myvar2 = nb :: func ();,“Qualquer nome do espaço de nome da NB só pode ser usado no fn () escopo sem preceder com “NB ::,”Somente se não ocorreu nos nomes de NA e globais (blocos). Caso contrário, deve ser precedido por “NB ::.”A região dos espaços de nome combinados para NA e global continuam abaixo do fn () definição e no principal() função até o final do arquivo.
A extensão do espaço para nome da NB começa de “int myvar2 = nb :: func ();" no fn () bloco e termina no final do fn () bloco de definição.
Observação: Namespaces cujas regiões são unidas não devem ter o mesmo nome de variável em seus diferentes blocos de namespace, pois isso ainda causaria conflitos.
Regiões de espaço para nome
Um espaço para nome é um escopo. Além do espaço para nome global (escopo global), qualquer espaço para nome deve ser declarado em um bloco. Esse bloco é a primeira parte das regiões possivelmente distribuídas do espaço para nome. Com a diretiva de uso, o espaço para nome pode ser estendido como regiões em outros escopos.
Diz -se que as entidades declaradas em um órgão de nomes são membros do espaço para nome, e os nomes introduzidos por essas declarações na região declarativa do espaço para nome são considerados nomes de membros do espaço para nome.
Namespaces aninhados
O programa a seguir mostra namespaces aninhados:
#incluir
usando namespace std;
namespace a
int i = 1;
namespace B
int i = 2;
namespace c
int i = 3;
int main ()
cout << A::i << " <<
A :: b :: eu << " <<
A :: b :: c :: eu << '\n';
retornar 0;
A saída é:
1 2 3Observe que os três valores foram acessados usando o operador de resolução de escopo.
Namespace padrão
C ++ tem uma biblioteca chamada Biblioteca Padrão. Os nomes de objetos, funções e outras entidades nesta biblioteca são de um espaço de nome chamado namespace padrão, escrito como std. A biblioteca padrão contém sub-bibliotecas, e uma dessas sub-bibliotecas é iostream. O iostream Biblioteca contém o objeto cout, que é usado para enviar resultados para o console (terminal).
O nome cout deve estar no std espaço para nome. Usar iostream com seu std namespace, o programa deve ser o seguinte:
#incluirObserve o uso do usando diretiva e std. O termo "#incluir ”É uma diretiva de pré -processador e não termina com um semicolon. Inclui o "arquivo" iostream na posição de sua diretiva.
Conclusão
Um espaço para nome é um escopo. A descrição do espaço para nome (definição) contém declarações básicas e/ou definições de objetos, funções e outras entidades C ++. Fora da definição de espaço para nome, o nome pode ser acessado com a sintaxe, “Namespacename :: nome.”Além do espaço para nome global (escopo global), qualquer espaço para nome deve ser declarado em um bloco. Esse bloco é a primeira parte das regiões possivelmente distribuídas do espaço para nome. Com o usando Diretiva, o espaço para nome pode ser estendido como regiões em outros escopos. Namespaces cujas regiões são unidas não devem ter o mesmo nome de variável em seus diferentes blocos de namespace, pois isso ainda causaria o nome de conflito.