Namespace in C++

Sappiamo bene che nei linguaggi di programmazione non possiamo avere due elementi (variabili, funzioni, classi) con lo stesso nome.

Immaginiamo di dover utilizzare una libreria scritta da qualcun altro, come facciamo ad essere sicuri che tra il nostro codice e il loro non vi siano elementi con lo stesso nome, dobbiamo forse leggere tutto il loro codice e modificarlo dove serve?

Nei linguaggi di programmazione moderni, questo non si fa mai, ci vengono forniti infatti degli strumenti per risolvere questo problema.

In italiano siamo in grado di riconoscere la differenza tra la pesca (frutto) e la pesca (sport) dal contesto della frase. Il contesto del C++ si chiama namespace.

I namespace, equivalenti ai package di Java, ci permettono di distinguere due elementi con lo stesso nome racchiudendoli in spazi diversi.

Usare un Namespace

Torniamo all'hello world che abbiamo scritto qualche articolo fa:

#include <iostream>

int main(){

    //cout è nel namespace 'std'
    std::cout << "Ciao!";

    return 0;
}

Alla riga 5 troviamo std::, ecco std è il namespace che contiene cout. Per utilizzare un elemento all'interno di un namespace dobbiamo precedere l'elemento con il nome del namespace e l'operatore di scope ::

Clausola Using

In alternativa, se non abbiamo situazioni di ambiguità dei nomi, possiamo usare la clausola using ed evitare di aggiungere namespace::

#include <iostream>

//così non devo mettere 'std::' davanti a cout
using namespace std;

int main(){

    //cout è nel namespace 'std'
    cout << "Ciao!";

    return 0;
}

Definire un Namespace

Anche noi possiamo definire un namespace contenente i nostri elementi, vediamo come:

#include <iostream>

namespace utility {

    const int costante = 1000;

    int somma(int x, int y) {
        return x + y;
    }
}

namespace prova {

    const int costante = 500;
}

int main() {

    std::cout << "Ciao!" << std::endl;

    std::cout << utility::costante << std::endl;

    std::cout << prova::costante << std::endl;

    std::cout << utility::somma(10, 5) << std::endl;

    return 0;
}
© Nicola Bovolato 2020