i Namespace

Questo concetto è la risposta al comune problema delle definizioni multiple. Immagina di avere due file header che descrivono due tipi differenti, ma che hanno lo stesso nome. Come facciamo ad utilizzarli entrambi ?

La risposta in C++ sta nei namespace. Si definiscono tipi e funzioni in un namespace e dopo li si usano. I namespace sono definiti usando la parola riservata namespace, seguita da un identificatore. Ma vediamo subito un esempio...

namespace Geometry
{
  struct Vector
  {
    float x, y;
  };

  float Norm (Vector v);
}
In questo esempio, quello che c'è dentro le {} è normale codice C++. Per usare questo codice, devi specificare al compilatore che adesso stai per usare il namespace geometry. Ci sono due modi di fare questo: specificando per una singola variabile il suo namespace (la sintassi è namespace::variabile) o usando la sequenza di parole riservate using namespace.

// Esempio con ::
void Foo1()
{
  Geometry::Vector v = {1.0, 2.0};
  float f = Geometry::Norm (v);
}

// Con l'uso delle parole chiave "using namespace"
using namespace Geometry;
void Foo2()
{
  Vector v = {1.0, 2.0};
  float f = Norm (v);
}
Quando usi la sequenza using namespace, potresti avere dei problemi se due o più namespace definiscono lo stesso tipo. Se c'è del codice ambiguo, il compilatore non lo compilerà. Per esempio...

namespace Geometry
{
  struct Vector
  {
    float x, y;
  };
}

namespace Transport
{
  struct Vector
  {
    float speed;
  };
}

using namespace Geometry;
using namespace Transport;

void foo()
{
  Vector v0;              // Errore: ambiguità
  Geometry::Vector v1;    // OK
  Transport::Vector v2;   // OK
}
Un ultima cosa (ovvia ?): non puoi usare un namespace se non è ancora stato definito...


C++