Spazio dei nomi C++

C Namespace



Uno spazio dei nomi in C++ è un ambito generalizzato. La sua dichiarazione inizia con la parola riservata, namespace, seguita da un nome scelto dal programmatore e quindi dal blocco tra parentesi graffe. Il blocco contiene dichiarazioni di base e/o definizioni di oggetti, funzioni e altre entità C++.

Considera le seguenti due istruzioni scalari in un ambito globale, nel seguente programma:







#includere
usando lo spazio dei nomi std;

intvarId= 5;
galleggiantevarId= 2.3;

intprincipale()
{

Restituzione 0;
}

Un tentativo di compilare questo programma porta a un errore di compilazione. Ci sono due variabili con lo stesso nome, varId . Sebbene siano due variabili diverse di due tipi diversi, int e galleggiante , il compilatore rifiuta le due dichiarazioni perché hanno lo stesso nome. Il seguente programma risolve questo problema dichiarando le variabili con lo stesso nome in due diversi ambiti generalizzati:



#includere
usando lo spazio dei nomi std;

spazio dei nomi NA
{
intvarId= 5;
}

spazio dei nomi NB
{
galleggiantevarId= 2.3;
}

intprincipale()
{
costo<<N / A::varId << ' ';
costo<<NB::varId << ' ';

Restituzione 0;
}

L'output è il seguente:



5
2.3

Ci sono due namespace nel programma sopra: N / A , che ha la definizione di intero, e NB , che ha la definizione di float ma con lo stesso nome dell'intero per NA. Infine, quando il programma è stato eseguito, è stato utilizzato lo stesso nome per due diverse variabili. Si noti che per accedere allo stesso nome di due variabili diverse, è necessario utilizzare il nome particolare per lo spazio dei nomi, seguito dall'identificatore comune. Il nome dello spazio dei nomi e l'identificatore comune sono separati dall'operatore di risoluzione dell'ambito, :: . Il nome dei namespace differenzia gli oggetti.





Questo articolo copre il concetto di base di uno spazio dei nomi e il suo utilizzo nel linguaggio di programmazione C++. Per seguire questo articolo, dovresti avere una conoscenza di base del linguaggio C++. Dovresti anche conoscere l'ambito C++, sebbene sia spiegato brevemente in questo articolo. Per saperne di più sull'ambito C++, cercare la frase Scope in C++ (senza virgolette) nella casella di ricerca di qualsiasi pagina Web linuxhint.com e premere Invio. Questo ti porterà all'articolo scritto da questo autore.

Contenuto dell'articolo

Che cos'è uno spazio dei nomi?

Una regione dichiarativa è la parte più grande di un programma in cui è valido il nome di un'entità (variabile). Questa regione è chiamata ambito. Uno spazio dei nomi in C++ è un ambito generalizzato il cui scopo principale è risolvere i conflitti di nomi. Uno spazio dei nomi ha dichiarazioni di base e/o definizioni di entità.



Spazio dei nomi globale e il suo problema

Lo spazio dei nomi globale è l'ambito globale. Considera il seguente breve programma:

#includere
usando lo spazio dei nomi std;

intidentità= 55;
galleggianteidentità= 12.17;

intprincipale()
{

Restituzione 0;
}

Nel programma sopra, ci sono due variabili, entrambe chiamate identità . Queste variabili sono nell'ambito globale; cioè, sono nello spazio dei nomi globale. Un tentativo di compilare questo programma fallirà con un messaggio di errore. L'ambito globale non accetta più di una variabile con lo stesso nome, quindi è necessario uno spazio dei nomi personalizzato.

Spazio dei nomi personalizzato

Uno spazio dei nomi non ha un solo nome. Invece, uno spazio dei nomi ha un insieme di nomi per evitare conflitti con altri insiemi di nomi. Per evitare conflitti nella parte inferiore del codice, precedere ogni nome con il nome dello spazio dei nomi e :: . Il seguente programma illustra ciò utilizzando due spazi dei nomi personalizzati:

#includere
usando lo spazio dei nomi std;

spazio dei nomi NA
{
intvarInt= 6;
galleggianteflt;
}

spazio dei nomi NB
{
intvarInt= 7;
galleggianteflt;
}

intprincipale()
{
costo<<N / A::varInt << ' ';
costo<<NB::varInt << ' ';
N / A::flt = 2,5;
NB::flt = 4.8;
costo<<N / A::flt << ' ';
costo<<NB::flt << ' ';

Restituzione 0;
}

L'uscita è:

6
7
2,5
4.8

Nota che i nomi NA::flt e NB::flt sono stati definiti in ultima analisi nel principale() funzione. Il C++ non consente tale definizione nell'ambito globale.

Si noti che lo spazio dei nomi personalizzato è uno spazio dei nomi nidificato per lo spazio dei nomi globale.

La direttiva di utilizzo

Per evitare di digitare sempre namepace::name invece di solo name dopo aver dichiarato lo spazio dei nomi, puoi usare il usando direttiva. La sintassi per usare il usando direttiva è la seguente:

usando lo spazio dei nomi Namespace_name;

Il usando non è una direttiva per il preprocessore, quindi termina con un punto e virgola (;).

Il seguente programma illustra l'uso del usando direttiva e altro ancora:

#includere
usando lo spazio dei nomi std;

spazio dei nomi NB
{
intvarInt= 7;
intfunzione()
{
RestituzionevarInt;
}
}

intfn()
{
utilizzando lo spazio dei nomi NB;
intmyVar2=funzione();
//seguono altri oggetti e funzioni da NB.
RestituzionemyVar2;
}

intmyVar3=NB::funzione();

intprincipale()
{
costo<<fn() << '' <<myVar3<< ' ';

Restituzione 0;
}

L'output di questo programma è 7 7 . Il termine utilizzando lo spazio dei nomi NB; è stato posizionato all'inizio del fn() definizione. Il funzione () dallo spazio dei nomi NB viene chiamato appena sotto, senza precederlo con NB:: .

Una variabile dichiarata nell'ambito globale (spazio dei nomi globale) è vista dal punto di dichiarazione alla fine del file. Si vede anche negli spazi dei nomi annidati (ambiti annidati), come annidati fn() portata della funzione sopra. Il usando La direttiva unisce il suo spazio dei nomi dalla posizione in cui è posizionato alla fine dell'ambito in cui è posizionato.

Il nome funzione () dallo spazio dei nomi NB non può essere visto sotto il fn() definizione perché utilizzando lo spazio dei nomi NB; è stato inserito nell'ambito della funzione (blocco). In questa condizione, per usare funzione () fuori dal blocco namespace NB (scope), deve essere preceduto da NB:: , come nella seguente dichiarazione:

intmyVar3=NB::funzione();

Il usando La direttiva unisce il proprio spazio dei nomi con lo spazio dei nomi di nidificazione esterno dalla posizione in cui è posizionato alla fine dello spazio dei nomi di nidificazione esterno. Nel seguente programma, lo spazio dei nomi NA viene unito allo spazio dei nomi globale. Entrambi gli spazi dei nomi si estendono quindi nel fn() spazio dei nomi di definizione della funzione, in cui sono uniti allo spazio dei nomi NB. Lo spazio dei nomi NB termina alla fine del fn() definizione della funzione e i due spazi dei nomi precedenti continuano fino alla fine del file (leggere il codice).

#includere
usando lo spazio dei nomi std;

spazio dei nomi NA
{
intvarInt= 6;
intfunzione()
{
RestituzionevarInt;
}

}

spazio dei nomi NB
{
intvarInt= 7;
intfunzione()
{
RestituzionevarInt;
}
}

usando lo spazio dei nomi NA;
intmiaVar0=varInt;
// seguono altri oggetti e funzioni da :: e NB.

intfn()
{
intmyVar1=varInt;
utilizzando lo spazio dei nomi NB;
intmyVar2=NB::funzione();
//seguiranno altri oggetti e funzioni da NB, fino alla fine di questo ambito.
RestituzionemyVar1+myVar2;
}

//Seguono solo oggetti e funzioni da :: e NB.

intmyVar3=NB::funzione();

intprincipale()
{
costo<<miaVar0<< '' <<fn() << '' <<myVar3<< ' ';

Restituzione 0;
}

L'uscita è 6, 13, 7 .

Nota: Lo spazio dei nomi globale è indicato con :: , il che significa che non c'è nulla prima dell'operatore di risoluzione dell'ambito che segue.

Sotto la dichiarazione, il utilizzando lo spazio dei nomi NA; le variabili dagli spazi dei nomi globale e NA possono essere utilizzate senza un'indicazione del loro spazio dei nomi di origine. La prossima affermazione usa il varInt dello spazio dei nomi di NA. La regione dello spazio dei nomi combinata globale e NA si estende nel fn() spazio dei nomi della funzione. Così il varInt della prima affermazione in fn() l'ambito della funzione, è dello spazio dei nomi NA.

Poiché la regione per gli spazi dei nomi globale e NA si estende in tutto il fn() ambito, dopo il int miaVar2 = NB::func(); , qualsiasi nome dallo spazio dei nomi NB può essere utilizzato solo nel fn() ambito senza precederlo con NB:: , solo se non si è verificato negli spazi dei nomi NA e globali (blocchi). In caso contrario, dovrebbe essere preceduto da NB:: . La regione degli spazi dei nomi combinati per NA e globale continua sotto il fn() definizione e nel principale() funzione fino alla fine del file.

L'estensione dello spazio dei nomi NB inizia da int miaVar2 = NB::func(); nel fn() blocco e termina alla fine del fn() blocco di definizione.

Nota: Gli spazi dei nomi le cui regioni sono unite non dovrebbero avere lo stesso nome di variabile nei loro diversi blocchi di spazi dei nomi, poiché ciò causerebbe comunque conflitti.

Regioni dello spazio dei nomi

Uno spazio dei nomi è un ambito. A parte lo spazio dei nomi globale (ambito globale), qualsiasi spazio dei nomi dovrebbe essere dichiarato in un blocco. Quel blocco è la prima parte delle possibili regioni distribuite dello spazio dei nomi. Con la direttiva using, lo spazio dei nomi può essere esteso come regioni in altri ambiti.

Le entità dichiarate in un corpo dello spazio dei nomi sono dette membri dello spazio dei nomi e i nomi introdotti da queste dichiarazioni nella regione dichiarativa dello spazio dei nomi sono detti nomi membri dello spazio dei nomi.

Spazi dei nomi nidificati

Il seguente programma mostra gli spazi dei nomi nidificati:

#includere
usando lo spazio dei nomi std;

spazio dei nomi A
{
intio= 1;
spazio dei nomi B
{
intio= 2;
spazio dei nomi C
{
intio= 3;
}
}
}

intprincipale()
{
costo<<A::io << '' <<A::B::io << '' <<A::B::C::io << ' ';

Restituzione 0;
}

L'uscita è:

1 2 3

Si noti che è stato possibile accedere ai tre valori utilizzando l'operatore di risoluzione dell'ambito.

Spazio dei nomi standard

C++ ha una libreria chiamata libreria standard. I nomi di oggetti, funzioni e altre entità in questa libreria provengono da uno spazio dei nomi chiamato spazio dei nomi standard, scritto come ore . La libreria standard contiene sotto-librerie e una di queste sotto-librerie è iostream . Il iostream la libreria contiene l'oggetto costo , che viene utilizzato per inviare i risultati alla console (terminale).

Il nome costo deve essere nel ore spazio dei nomi. Usare iostream con i suoi ore namespace, il programma dovrebbe essere il seguente:

#includere
usando lo spazio dei nomi std;

Notare l'uso del usando direttiva e ore . Il termine #includere è una direttiva per il preprocessore e non termina con un punto e virgola. Include il file iostream nella posizione della sua direttiva.

Conclusione

Uno spazio dei nomi è un ambito. La descrizione dello spazio dei nomi (definizione) contiene dichiarazioni di base e/o definizioni di oggetti, funzioni e altre entità C++. Al di fuori della definizione dello spazio dei nomi, è possibile accedere al nome con la sintassi, namespaceName::name . A parte lo spazio dei nomi globale (ambito globale), qualsiasi spazio dei nomi dovrebbe essere dichiarato in un blocco. Quel blocco è la prima parte delle possibili regioni distribuite dello spazio dei nomi. Con il usando direttiva, lo spazio dei nomi può essere esteso come regioni in altri ambiti. Gli spazi dei nomi le cui regioni sono unite non dovrebbero avere lo stesso nome di variabile nei loro diversi blocchi di spazi dei nomi, poiché ciò causerebbe comunque un conflitto di nomi.

cris