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...