C++ es uno de los lenguajes más usados por los programadores, es un lenguaje rápido, eficaz y flexible.

Con este lenguaje podrás crear todo tipo de programas, desde videojuegos, motores gráficos, hasta controladores de hardware y sistemas operativos. Por todo esto vamos a ver la importancia que tienen y como nos  ayudan los namespaces (o espacio de nombre) a la hora de desarrollar en C++ cuando declaramos funciones.

¿Qué son los namespaces?

Un namespace, no es más que una forma de crear un bloque, y que todas las funciones que estén dentro del mismo, estén asociadas a ese namespace (o espacio de nombres), al cual se le asigna un nombre para identificarlo.

Por ejemplo:

namespace hola

    void f() 
    { 
        std::cout << “hola”;
    }

En este ejemplo, la función f está asociada al namespace hola.

¿Por qué surgieron los namespaces?

Todo se remonta al lenguaje C, en el que no existe el concepto de namespace.

En este lenguaje, a la hora de importar una librería, si esa librería tenía, por ejemplo, una función print, si nuestro programa contenía ya esa función, teníamos un problema, ya que ni en C ni en C++ se pueden declarar y definir funciones con el mismo nombre.

La solución para que eso no ocurriera fue comenzar a utilizar acrónimos, para que las funciones empezaran o acabaran con ese nombre.

Por ejemplo, OpenGL, todas sus funciones comienzan por gl, de esta forma cuando se llama a una función gl_print, sabemos que es de OpenGL y no tendremos problemas, ya que es extraño que otra persona tenga en su código una función llamada gl_print.

Para evitar esto, se añadieron los namespace a C++.

Ejemplos de namespaces

Por ejemplo, creamos una función f, la compilamos y la llamamos, nos mostrará la palabra “adios”:

void f() 
{ 
     std::cout << “adios”; 
}

Si posteriormente añadimos otra función f, que escriba “hola”, la ejecutamos, se produce un error de compilación, ya que la función ya existe.


void f()
{
    std::cout << “adios”;
}

void f()
{
   std::cout << “hola”;
}

Al añadir el namespace se evita ese problema. Para utilizar el namespace hola, solo tenemos que indicar el nombre del mismo, seguido dos puntos dobles, que es el ámbito al que pertenece la función, y llamar a la función que queremos.

Con esto no solo podemos encapsular funciones, sino también atributos, objetos, clases y muchas cosas más de C++.


namespace hola

{
    void f() { std::cout << “hola”;
}

void f()
{
    std::cout << “adios”;
}

int main()
{
    f();
hola::f();
getchar();
return 0;
}

Al ejecutar ese código se nos muestra “adioshola”.

Hay una forma para evitar usa estos encapsulamientos, que sería así:


using namespace std;

int main()
{
    f();
hola::f();
cout << “loquesea”;
getchar();
return 0;
}

De esta forma, al indicar el namespace std, que es el namespace dónde está incluida toda la librería estándar de C++, ya no tenemos que indicar std::cout, sino que directamente indicamos cout.

Al utilizar este sistema hay que tener cuidado, porque se puede presentar algún problema de ambigüedad. Por ejemplo:


namespace hola

{
    void f() { std::cout << “hola”;
}

void f()
{
    std::cout << “adios”;
}

using namespace std;
using namespace hola;

int main()
{
    f();
hola::f();
cout << “loquesea”;
getchar();
return 0;
}

Se produce una ambigüedad al emplear el using namespace, ya que tanto std como hola tienen incluida la función f. Lo mismo ocurriría en caso de otra función que estuviese incluida en ambos namespaces.

Para evitar este problema de ambigüedad habría que separar esos namespaces, por ejemplo así:

namespace hola<
{
void f() { std::cout << “hola”;
}

namespace otro
{

void f()
{
    std::cout << “adios”;
}
}

using namespace std;
using namespace hola;

int main()
{
f();
otro::f();
cout << “loquesea”;
getchar();
return 0;
}

Es importante saber separar los using namespace, y no se recomienda utilizar el using namespace std a menos que se esté muy seguro de que no va haber ninguna función que se utilice.

Además no es recomendable utilizar using namespace dentro de los archivos de cabecera *.hpp, que son incluidos en otros ficheros, y que puede provocar inclusiones recursivas, con lo que puede fallar y no que si lo provoca nuestro código o a una librería externa.