Spazi dei nomi in C++

Jinku Hu 12 ottobre 2023
  1. Usa la parola chiave namespace per creare un nuovo namespace in C++
  2. Utilizzare gli spazi dei nomi nidificati per implementare ambiti complessi in C++
Spazi dei nomi in C++

Questo articolo spiegherà come utilizzare gli spazi dei nomi in C++.

Usa la parola chiave namespace per creare un nuovo namespace in C++

C++ ha il concetto di spazi dei nomi che aiutano a prevenire un problema comune nei progetti di grandi dimensioni chiamato conflitti di nomi. Quando un determinato progetto utilizza librerie diverse sviluppate da team indipendenti e ha molti nomi globali per oggetti diversi, diventa inevitabile che alcuni nomi corrispondano e causino errori. Lo spazio dei nomi dichiara un ambito in cui sono definiti determinati nomi di funzioni o altri oggetti. Ricorda che ci sono regole di ambito automatiche in C++ che governano il modo in cui i nomi degli oggetti vengono visualizzati e disponibili in diverse aree di codice. Ad esempio, la variabile locale dichiarata nella funzione non è visibile o accessibile al di fuori del corpo della funzione. Quindi, un’altra variabile con lo stesso nome può essere dichiarata al di fuori del corpo di questa funzione senza conflitti. Dall’altro, abbiamo un unico ambito globale, che viene spesso utilizzato da programmi di grandi dimensioni per rendere disponibili determinati oggetti attraverso i file o le funzioni. Ora, immagina come può essere gestito lo spazio senza alcun meccanismo di selezione manuale.

In effetti, i programmatori si occupavano della collisione dei nomi usando nomi molto lunghi per gli oggetti globali. Può funzionare per progetti di dimensioni relativamente piccole, ma rende il codice piuttosto disordinato da leggere e la soluzione non può ancora impedire le collisioni di nomi senza uno schema di denominazione coordinato.
Gli spazi dei nomi forniscono un meccanismo per partizionare un ambito globale (di conseguenza chiamato spazio dei nomi). Un namespace è dichiarato con la parola chiave namespace seguita dal nome stesso del namespace. Quindi segue il codice tra parentesi graffe simile al blocco funzione e termina senza punto e virgola. Le stesse regole di ambito automatico governano le variabili all’interno di uno spazio dei nomi come altre parti del codice. I nomi degli oggetti a cui è necessario accedere dall’esterno dello spazio dei nomi devono iniziare con il nome dello spazio dei nomi in cui sono definiti, seguito dalla notazione con due punti e poi dal nome dell’oggetto. L’esempio di codice seguente mostra il caso d’uso di base per gli spazi dei nomi nello stesso file.

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

Produzione:

123
456

Utilizzare gli spazi dei nomi nidificati per implementare ambiti complessi in C++

Gli spazi dei nomi possono essere nidificati, in modo simile alle istruzioni loop. Per impostazione predefinita, uno spazio dei nomi nidificato ha accesso ai nomi degli oggetti nello spazio dei nomi esterno, ma quest’ultimo (spesso chiamato spazio dei nomi padre) non può accedere ai membri nello spazio dei nomi interno. Tuttavia, è possibile specificare la parola chiave inline prima della dichiarazione dello spazio dei nomi interno per rendere accessibili i suoi membri nello spazio dei nomi padre. Gli spazi dei nomi possono essere definiti in luoghi diversi. Vale a dire, la stessa definizione dello spazio dei nomi può estendersi su file diversi o posti separati nel singolo file poiché gli spazi dei nomi dinno sono definiti nell’esempio seguente.

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

Produzione:

123
456
980
990
199
Autore: 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